问题描述
我连续2016年至2020年有5个小标题。我对每个小标题都做相同的事情,因此我想使用for循环,而不是复制和粘贴相同的代码5次。我用以下方式命名了小标题,最后的数字表示数据的年份:
- alpha_20
- beta_20
- gamma_20
- delta_20
- epsilon_20
我的想法是这样做:
for (i in 16:20) {
alpha_a_[i]<-alpha_[i]%>%
mutate(NEWVAR=1+OLDVAR)%>%
select(NEWVAR,VAR2,VAR3)
beta_a_[i]<-beta_[i]%>%
group_by(PIN)%>%
summarize(sum(VAR1))
# and so on for all 5 tibbles
}
但是我认为我没有正确地调用小标题,因为代码在第一个突变时就中断了。我似乎无法弄清楚如何指示它接受以“ 16”结尾的小标题,然后接受以“ 17”结尾的小标题,等等。
解决方法
您可以尝试使用get
,assign
和paste
的组合。
for (i in 16:20) {
alpha <- get(paste("alpha_",i,sep = "")) %>%
mutate(NEWVAR = 1 + OLDVAR) %>%
select(NEWVAR,VAR2,VAR3)
assign(paste("alpha_a_",sep = ""),alpha)
beta <- get(paste("beta_",sep = "")) %>%
group_by(PIN) %>%
summarize(sum(VAR1))
assign(paste("beta_a_",beta)
# and so on for all 5 tibbles
}
,
这里发生了几件事。首先,为了实际调用小标题的名称,您需要在字符串名称上使用get()
函数。尝试在命令行中键入“ alpha_20”与get(“ alpha_20”)。但是,现在将其编码为alpha_[i]
的方式将不会生成所需的字符串。要将小标题的名称生成为字符串,您需要执行类似get(paste0("alpha_",i))
的操作。
这仅仅是为了获得想要的小标题。要在for循环中编辑/保存它,请查看assign()
命令(请参见Change variable name in for loop using R)。因此,总的来说,您的代码将如下所示:
> require(tidyverse)
> alpha_20 <- data.frame(x = 1:5,y = 6:10)
> alpha_20
x y
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
>
> for (i in 20) {
+ assign(paste0('alpha_',i),+ get(paste0('alpha_',i)) %>%
+ mutate(z = 11:15))
+ }
> alpha_20
x y z
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15