【问题标题】:How can I read multiple csv files into R at once and know which file the data is from?如何一次将多个 csv 文件读入 R 并知道数据来自哪个文件?
【发布时间】:2022-05-05 23:18:36
【问题描述】:

我想将多个 csv 文件读入 R 并将它们组合成一个大表。但是,我需要一列来标识每行来自哪个文件。

基本上,文件中的每一行都有一个唯一的标识号,但这些数字在文件中重复出现。因此,如果我在不知道每一行来自哪个文件的情况下将所有文件绑定到一个表中,我将不再有唯一标识符,这使得我计划的分析变得不可能。

到目前为止我所拥有的是这个,但这并没有告诉我数据来自哪个文件。

list_file <- list.files(pattern="*.csv") %>% lapply(read.csv,stringsAsFactors=F)
combo_data <- list.rbind(list_file)

我有大约 100 个文件要读入,因此非常感谢任何帮助,因此我不必单独完成所有文件。

【问题讨论】:

    标签: r


    【解决方案1】:

    一种方法是使用 purrr 中的 map_df 将所有 csv 绑定到一个具有唯一列标识符的文件中。

    filenames <- list.files(pattern="*.csv")
    
    purrr::map_df(filenames, read.csv,stringsAsFactors = FALSE, .id = 'filename') %>%
      dplyr::mutate(filename = filenames[filename]) -> combo_data
    

    还有:

    combo_data <- purrr::map_df(filenames, 
                  ~read.csv(.x, stringsAsFactors = FALSE) %>% mutate(filename = .x))
    

    在基础 R 中:

    combo_data <- do.call(rbind, lapply(filenames, function(x) 
                         cbind(read.csv(x, stringsAsFactors = FALSE), filename = x)))
    

    【讨论】:

      【解决方案2】:

      如果你想使用基础R,你可以使用

      file.names <- list.files(pattern = "*.csv")
      
      df.list <- lapply(file.names, function(file.name)
                                    {
                                          df           <- read.csv(file.name)
                                          df$file.name <- file.name
                                          return(df)
                                     })
      
      df <- list.rbind(df.list)
      

      【讨论】:

        【解决方案3】:

        As other answer suggested,现在 tidyverse 让事情变得更简单了:

        library(readr)
        library(purrr)
        library(dplyr)
        library(stringr)
        
        df <- fs::dir_ls(regexp = "\\.csv$") %>%
        map_dfr(read_csv, id='path') %>%
        mutate(thename = str_replace(path, ".tsv","")) %>%
        select(-path)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-17
          • 1970-01-01
          相关资源
          最近更新 更多