我希望能够在使用dplyr时动态创建变量名,不过如果不使用dplyr的解决方案也可以。
例如:
data(iris)
library(dplyr)
iris <- iris %>%
group_by(Species) %>%
mutate(
lag_Sepal.Length = lag(Sepal.Length),
lag_Sepal.Width = lag(Sepal.Width),
lag_Petal.Length = lag(Petal.Length)
) %>%
ungroup
head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species lag_Sepal.Length lag_Sepal.Width
(dbl) (dbl) (dbl) (dbl) (fctr) (dbl) (dbl)
1 5.1 3.5 1.4 0.2 setosa NA NA
2 4.9 3.0 1.4 0.2 setosa 5.1 3.5
3 4.7 3.2 1.3 0.2 setosa 4.9 3.0
4 4.6 3.1 1.5 0.2 setosa 4.7 3.2
5 5.0 3.6 1.4 0.2 setosa 4.6 3.1
6 5.4 3.9 1.7 0.4 setosa 5.0 3.6
Variables not shown: lag_Petal.Length (dbl)
但是,我不想重复做三次相同的事情,而是要创建100个这样的“滞后”变量,它们会接受名称:lag_original variable name。我正在尝试弄清楚如何在不输入新变量名称100次的情况下完成此操作,但是我一直没有头绪。
我查看了这个示例以及SO上的这个示例。它们很相似,但我无法拼凑出我需要的具体解决方案。感谢任何帮助!
编辑
感谢@BenFasoli的启发。我稍微修改了他的答案,得到了我需要的解决方案。
我还使用了这篇RStudio博客和这篇SO文章。变量名称中的“lag”在末尾而非开头,但我可以接受。
我最终的代码发布在这里,以防对其他人有用:
lagged <- iris %>%
group_by(Species) %>%
mutate_at(
vars(Sepal.Length:Petal.Length),
funs("lag" = lag)) %>%
ungroup
# A tibble: 6 x 8
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length_lag Sepal.Width_lag
<dbl> <dbl> <dbl> <dbl> <fctr> <dbl> <dbl>
1 5.1 3.5 1.4 0.2 setosa NA NA
2 4.9 3.0 1.4 0.2 setosa 5.1 3.5
3 4.7 3.2 1.3 0.2 setosa 4.9 3.0
4 4.6 3.1 1.5 0.2 setosa 4.7 3.2
5 5.0 3.6 1.4 0.2 setosa 4.6 3.1
6 5.4 3.9 1.7 0.4 setosa 5.0 3.6
# ... with 1 more variables: Petal.Length_lag <dbl>
lagged <- iris %>% group_by(Species) %>% mutate_at( vars(Sepal.Length:Petal.Length), funs("lag" = lag)) %>% ungroup
再次感谢! - Brad Cannell