【问题标题】:R - variable name in loopR - 循环中的变量名
【发布时间】:2019-02-03 05:55:30
【问题描述】:

假设有 10 个名称类似于 as 的 csv 文件

file_1_tail.csv 
file_2_tail.csv 
file_3_tail.csv  
...  
file_10_tail.csv

名称的唯一区别在于数字(1 到 10)。每个都具有相同的结构 - 1000 行和 100 列。

我需要将它们读入 R,选择特定列并作为新文件写入。我的一个文件的代码如下:

file_2_tail = read_csv("file_2_tail.csv")
file_2_tail_selected = file_2_tail[,c(1:7,30)])
write.csv2(file_2_tail_selected, file = "file_2_selected.csv")

现在我想使用循环为所有十个文件自动执行此操作。

for (i in 1:10){    
file_"i"_tail = read_csv("file_"i"_tail.csv")
file_"i"_tail_selected = file_"i"_tail[,c(1:7,30)]
write.csv2(file_"i"_tail_selected, file = "file_"i"_selected.csv")
}

当然它不起作用 - i 在这种表示法中不可读。我应该如何解决这个问题?

【问题讨论】:

    标签: r loops variables


    【解决方案1】:

    您不能将read_csv 结果分配给这样的字符串。相反,您可以将其存储在一个临时变量 tmp

    for (i in 1:10){    
      tmp <- read_csv(paste0("file_", i, "_tail.csv"))
      tmp <- tmp[, c(1:7,30)]
      write.csv2(tmp, file = paste0("file_", i, "_selected.csv"))
    }
    

    顺便说一句,这可能是读取多个文件的更有效方式

    library(tidyverse)
    
    filePattern <- "\\.csv$"
    fileList <- list.files(path = ".", recursive = FALSE,
                           pattern = filePattern, full.names = TRUE)
    
    result <- fileList %>%
      purrr::set_names(nm = (basename(.) %>% tools::file_path_sans_ext())) %>%
      purrr::map_df(read_csv, .id = "FileName") %>% 
      select(1:7, 30)
    result
    

    【讨论】:

    • @anba:没问题。顺便说一句,我更新了我的答案以包括一种更有效的方式来读取多个文件
    • @anba:顺便说一句,您可以直接在readr::read_csv 中选择您想要的列,以提高效率。看到这个答案stackoverflow.com/a/50652089
    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多