r语言 - 分组时间序列滞后于使用dplyr的选定变量



我试图使用dplyr为数据集中的每个组滞后一些变量(所有这些变量都有一个共同的命名约定)。

我认为mutate_if会工作,但我得到一个错误(下面)。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

这似乎有效,

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

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

此外,正如@StevenBeaupre提到的,

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

最新更新