【问题标题】:Use a variable in a loop to name a data frame in R在循环中使用变量来命名 R 中的数据框
【发布时间】:2021-04-20 09:30:01
【问题描述】:

我有 8 个 .csv 文件,每个文件包含 8 个湖泊的每日水平。我想创建一个循环来将这些文件中的每一个读入 R 并相应地命名它们。如何让循环为 R 数据框生成名称?以下是我尝试过的,我理解为什么它在循环的最后一行不起作用(但我不确定是否有替代方案)。我希望将数据帧命名为 Okareka_daily_levels、Okaro_daily_levels、....等。

Lake_names <- cbind("Okareka", "Okaro", "Okataina", "Rerewhakaaitu", "Rotokakahi", "Rotomahana", "Tarawera", "Tikitapu")

  
for (i in 1:8){
    name <- Lake_names[i]
    read_file <- gsub(" ", "", paste("Data\\", name, "_daily_levels.csv"))
    write_name <- gsub(" ", "", paste(name, "_daily_levels"))
    write_name <- as_tibble(read.csv(read_file)) # read file with lake elevations
  }

【问题讨论】:

    标签: r loops dynamic naming


    【解决方案1】:

    每次循环评估都会覆盖 write_name,因此您可能只获得最后一个湖名 (Tikitapu) 的内容。 for 循环中使用的惰性求值可能也无济于事。解决此问题的一种方法是将for 循环转换为lapply

    library(tidyverse)
    
    listOfTibbles <- lapply(
                       1:8,
                       function(i) {
                         name <- Lake_names[i]
                         read_file <- gsub(" ", "", paste("Data\\", name, "_daily_levels.csv"))
                         write_name <- gsub(" ", "", paste(name, "_daily_levels"))
                         # Note the edit to the next line: you need a return value.
                         as_tibble(read.csv(read_file)) # read file with lake elevations
                       }
                     )
    

    lapply 返回一个列表,列表中的每个元素都是将其第二个参数中定义的函数依次应用于第一个参数的元素的结果。所以你应该从这段代码中得到一个包含八个 tibbles 的列表。要将 tibble 列表合并为一个 tibble,您可以

    oneBigTibble <- listOfTibbles %>% bind_rows()
    

    这是未经测试的代码,因为我无权访问您的 CSV 文件。

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2016-09-28
      • 1970-01-01
      • 2012-12-28
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多