r - 如何使用 dplyr 根据函数结果创建新变量以产生分组数据?
问题描述
假设我有以下data.frame:
set.seed(7)
data = data.frame(a = rnorm(100),
b = rnorm(100),
c = rnorm(100))
然后我重新塑造了它:
long = reshape2::melt(data, measure.vars = c("a", "b", "c"))
然后,我想测试每个 a、b 和 c 变量是否存在UnitRoot。所以我使用 Urca 包中的 ur.df。这是我的问题:
如何使用dplyr创建一个新的指标变量,比如 1 或 0,以保持是否为 unitroot。我在想这样的事情:
output = long %>% group_by(variable) %>%
do(UR = summary(ur.df(.$value, type = c("trend"), selectlags = "BIC"))) %>%
summarise(variable, tau = UR@teststat[1],
tau_cri = UR@cval[1,3],
URT = if_else(UR@teststat[1] < UR@cval[1,3],
1, 0))
但是最后一段代码只是为每个组变量生成一个新的data.frame(输出),即“a,b和c”,并带有一个指示符是否有一个单元根。但我想要的是在同一个 data.frame 中生成一个新变量,我的意思是long。我想要这个,因为我可能必须根据该指标拆分我的 data.frame (可能在这里,你有另一个想法,以不同于我正在考虑的其他方式获得相同的结果。这也很受欢迎,但我如果您知道如何做我想做的事,将不胜感激)。
PD:我的代码的结果是这样的:
variable tau tau_cri URT
<fct> <dbl> <dbl> <dbl>
1 a -5.23 -3.15 1
2 b -7.83 -3.15 1
3 c -5.89 -3.15 1
解决方案
这是一种不同的方法。我们可以创建两个新列,一个带有ur.df
存储为 a 的对象,list
以便以后可以在需要时使用它来进行其他计算,另一个 ( URT
) 是一个指示变量,表示它是否unitroot
存在。
library(dplyr)
library(urca)
long %>%
group_by(variable) %>%
mutate(ur.df_obj = list(summary(ur.df(value, type = "trend", selectlags = "BIC"))),
URT = +(purrr::map_lgl(ur.df_obj, ~.x@teststat[1] < .x@cval[1,3])))
# variable value ur.df_obj URT
# <fct> <dbl> <list> <int>
# 1 a 2.29 <sumurca> 1
# 2 a -1.20 <sumurca> 1
# 3 a -0.694 <sumurca> 1
# 4 a -0.412 <sumurca> 1
# 5 a -0.971 <sumurca> 1
# 6 a -0.947 <sumurca> 1
# 7 a 0.748 <sumurca> 1
# 8 a -0.117 <sumurca> 1
# 9 a 0.153 <sumurca> 1
#10 a 2.19 <sumurca> 1
# … with 290 more rows
推荐阅读
- swift - macOS:从 CharacterPalette 中获取 Emoji(修订版)
- amazon-cloudformation - 创建 RDS 数据库用户 CloudFormation
- javascript - 随机化脚本中的颜色
- php - 从 mysql 中选择等于 URL 的值
- mysql - MySQL 每天只从相似记录中选择一条记录
- c# - 在不引发异常的情况下使异步方法失败
- flutter - 如何访问小部件或刚刚单击的按钮的文本?
- amazon-web-services - 如何使用 CRON 表达式在 AWS 中创建规则
- c - 为什么默认情况下未优化未引用的符号?
- javascript - 如何更改点击图标?