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