首页 > 解决方案 > 如何使用 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

标签: rdplyr

解决方案


这是一种不同的方法。我们可以创建两个新列,一个带有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

推荐阅读