对于跨多个数据帧或小标题的循环

问题描述

我连续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”结尾的小标题,等等。

解决方法

您可以尝试使用getassignpaste的组合。

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