繁体   English   中英

使用dplyr分组时间序列滞后于所选变量

[英]Grouped times series lag on selected variables using dplyr

我正在尝试使用dplyr为数据集中的每个组滞后一些变量(所有变量都有一个通用的命名约定)。

我以为mutate_if可以使用,但出现错误(如下)。 mutate_each有效,但适用于所有列,而不是选择少数列。

例如,我希望仅落后于Sepal测量:

iris %>% 
  tbl_df() %>%
  group_by(Species) %>%
  slice(1:3) %>%
  # mutate_each(funs(lag(.)))
  mutate_if(contains("Sepal"), funs(lag(.)))
#> Error in get(as.character(FUN), mode = "function", envir = envir) :  object 'p' of mode 'function' was not found

获得最终数据集,例如:

#   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#          <dbl>       <dbl>        <dbl>       <dbl>     <fctr>
# 1           NA          NA          1.4         0.2     setosa
# 2          5.1         3.5          1.4         0.2     setosa
# 3          4.9         3.0          1.3         0.2     setosa
# 4           NA          NA          4.7         1.4 versicolor
# 5          7.0         3.2          4.5         1.5 versicolor
# 6          6.4         3.2          4.9         1.5 versicolor
# 7           NA          NA          6.0         2.5  virginica
# 8          6.3         3.3          5.1         1.9  virginica
# 9          5.8         2.7          5.9         2.1  virginica

这似乎有效,

library(dplyr)
iris %>% 
     tbl_df() %>%
     group_by(Species) %>%
     slice(1:3) %>%
     mutate_if(grepl('Sepal', names(.)), funs(lag(.)))

正如@aosmith解释的, contains返回与字符串匹配的列的索引,而mutate_if依赖于使用返回逻辑向量的谓词函数,这就是grepl选项起作用的原因。

另外,正如@StevenBeaupre提到的那样,

iris %>% 
     tbl_df() %>%
     group_by(Species) %>%
     slice(1:3) %>% 
     mutate_at(vars(contains('Sepal')), lag)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM