【问题标题】:Grouped times series lag on selected variables using dplyr使用 dplyr 对选定变量的分组时间序列滞后
【发布时间】:2016-09-09 13:49:04
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • contains 返回与字符串匹配的列的索引,而不是逻辑向量。 mutate_if 依赖于使用返回逻辑向量的谓词函数,这就是 @Sotos 的 grepl 答案有效的原因。使用 mutate_at 而不是 contains 应该可以工作。
  • @aosmith 我在回答中添加了您的解释
  • 跟进@aosmith,如果您使用mutate_at(),请确保使用vars() 助手:mutate_at(vars(contains('Sepal')), lag)。另外,如果你想使用mutate_each(),你可以这样做:mutate_each(funs(lag), contains('Sepal'))

标签: r time-series dplyr


【解决方案1】:

这似乎有效,

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)

【讨论】:

  • 也许包括更惯用的:mutate_at(vars(contains('Sepal')), lag)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多