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

时间:2016-09-09 13:49:04

标签: r time-series dplyr

我正在尝试使用dplyr来延迟数据集中每个组的一些变量(所有变量都有一个共同的命名约定)。

我认为mutate_each可行,但我收到错误(如下)。 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

获取最终数据集,如:

join

1 个答案:

答案 0 :(得分:4)

这似乎有效,

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)