【问题标题】:Usage of rename function with paste in a for loop in R在R中的for循环中使用重命名函数并粘贴
【发布时间】:2020-09-12 15:36:46
【问题描述】:

我正在编写一个 for 循环来导入 6 个数据帧并对其应用某些处理。

b = 6
for (i in 1:b) {
  a = as.numeric(20200518)
  d = as.Date("2020-05-18")

  assign(paste("vacantes_", a + i, sep = ""), read_excel(paste("Favorites/Tito/01. aaaaaa/aaaaaaa 20/05. Data/
         01. aa/01. Módulo aaaaaaaaaaa/Vacante_inconsistencias_", a + i, ".xlsx", sep = ""),col_names = TRUE))

  assign(paste("vacantes_", a + i, "_llenado", sep = ""), get(paste("vacantes_", a + i, sep = "")) %>% 
         select("ddd", "uuuu", Llenó", "cod") %>% 
         group_by(ddd, uuuu, `Llenó`) %>% summarise(Cantidad = n()))

  assign(paste("vacantes_", a + i, "_llenado1", sep = ""), 
         dcast(get(paste("vacantes_", a + i, "_llenado", sep = "")), ddd + uuuu ~ `Llenó`, sum) %>% 
         mutate(Fecha = as.Date(d + i)) %>% select("Fecha", "ddd", "uuuu", "NO", "SÍ"))

  if(i == b){
    rm(a, b, i, d)
  }
}

在最后一个过程Cast(第三个函数)中,我想重命名每个数据帧中的两列,所以我将最后一行添加到代码的那部分:

## Cast  
assign(paste("vacantes_", a + i, "_llenado1", sep = ""), 
    dcast(get(paste("vacantes_", a + i, "_llenado", sep = "")), ddd + uuuu ~ `Llenó`, sum) %>% 
    mutate(Fecha = as.Date(d + i)) %>% select("Fecha", "ddd", "uuuu", "NO", "SÍ") %>% 
    rename(paste("NO_", a + 1, sep ="") = NO, paste("SI_", a + 1, sep ="") = SÍ))

重命名函数导致 for 循环根本不起作用。我得到了:

Error: inesperado '=' in:
" i, "_llenado1", sep = ""), dcast(get(paste("vacantes_", a + i, "_llenado", sep = "")), ddd + uuuu ~ `Llenó`, sum) %>% 
    mutate(Fecha = as.Date(d + i)) %>% select("Fecha", "ddd", "uuuu", "NO", "SÍ")) %>% rename_(paste("NO_", a + 1, sep ="") ="

我尝试添加rename(get(paste("NO_", a + 1, sep ="")) = NO, get(paste("SI_", a + 1, sep ="")) = SÍ),但它也不起作用。

为了澄清,我删除了 rename 行,并且 for 循环到目前为止按我想要的方式工作,所以这行代码就是问题所在。提前致谢。

【问题讨论】:

    标签: r for-loop dplyr tidyverse


    【解决方案1】:

    如果我们使用paste,那么一个选项是在评估(!!)时分配(:=

    library(dplyr)
    head(mtcars) %>% 
          rename(!!paste0('NO_', 2) := mpg, 'SI' = carb)
    #                  NO_2 cyl disp  hp drat    wt  qsec vs am gear SI
    #Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4  4
    #Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4  4
    #Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4  1
    #Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3  1
    #Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3  2
    #Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3  1
    

    【讨论】:

      【解决方案2】:

      您应该添加数据样本,例如与dput。将所有这些数据对象读入一个列表不是更容易吗:

      path <- "./files"
      files <- list.files(path = path,
                          full.names = TRUE,
                          all.files = FALSE)
      files <- files[!file.info(files)$isdir]
      
      data <- lapply(files,
                     function(x) {
                       read_excel(x, ,col_names = TRUE)
                     })
      

      然后应用您需要的任何数据转换?您可以通过将lapply 与您的转换功能结合使用来做到这一点。或者你可以bind_rows 一起使用你的dplyr 动词来进行转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多