【发布时间】: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