跨多个数据帧或 tibbles 的循环

For Loop across several data frames or tibbles

从 2016 年到 2020 年连续几年我有 5 个 tibbles。我对每组 tibbles 做同样的事情所以我想使用 for-loop 而不是复制和粘贴相同的代码 5 次.我用以下方式命名了 tibbles,最后的数字表示数据的年份:

我的想法是这样做:

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
    
    }

但我认为我没有正确调用 tibble,因为代码在第一次变异时就中断了。我似乎无法弄清楚如何指示它获取以“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_", i, sep = ""), alpha)
  
  
  beta <- get(paste("beta_", i, sep = "")) %>%
    group_by(PIN) %>%
    summarize(sum(VAR1))
  assign(paste("beta_a_", i, sep = ""), beta)
  
  # and so on for all 5 tibbles
  
}

这里发生了几件事。首先,为了实际调用您的 tibble 名称,您需要对字符串名称使用 get() 函数。尝试在命令行中键入“alpha_20”与 get(“alpha_20”)。但是,您现在将其编码为 alpha_[i] 的方式不会生成您想要的字符串。要将您的 tibble 名称生成为字符串,您需要执行类似 get(paste0("alpha_", i)).

的操作

这只是为了得到你想要的小标题。要在 for 循环中 edit/save 它,查看 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