【问题标题】:Merging csv files in R and adding a column with file names [duplicate]在R中合并csv文件并添加带有文件名的列[重复]
【发布时间】:2020-07-24 11:13:48
【问题描述】:

我想合并存储在一个文件夹中的多个 csv 文件,并在对应的行上添加一个包含每个 csv 文件名称的列。这些文件具有相同数量的列和列名。例如:

文件 1.csv 第 1 行,第 1 列:“a”,第 1 行,第 2 列:“b” 文件 2.csv 第 1 行第 1 列:“c”,第 1 行,第 2 列:“d”

期望的输出: 第 1 栏 第 2 栏 第 3 栏 一种。湾。文件 1.csv C。 d。文件2.csv

【问题讨论】:

  • 您想merge 文件还是append 他们?合并(大致)意味着添加新列;追加意味着添加新行。假设您有文件 A 和 B,每个文件有 50 行和 100 行和 10 列。 merge 输出可以有 50-150 行和 10-20 列;追加输出将有 150 行和 10 列。

标签: r


【解决方案1】:

您可以先在list.files 中指定pattern 参数来获取您想要的所有文件名。您可以使用lapply 阅读它们并添加一个新列。

files <- list.files(pattern = '\\.csv$', full.names = TRUE)

all_data <- do.call(rbind, lapply(files, function(x) 
                    transform(read.csv(x), File = basename(x))))

您也可以使用tidyverse 来执行此操作:

library(dplyr)
library(purrr)

all_data <- map_df(files, ~read.csv(.x) %>% mutate(File = basename(.x)))

【讨论】:

    【解决方案2】:

    这可以通过多种方式完成。我倾向于使用 fs 获取文件路径的数据框,然后使用 purrr 将 csv 作为嵌套数据框读取的方法:

    library(tidyverse)
    library(fs)
    dir_info() %>%
      filter(endsWith(path, ".csv")) %>%
      select(path) %>% 
      mutate(data = purrr::map(path, read_csv)) %>%
      unnest()
    

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 2017-04-21
      • 2019-03-25
      • 2020-09-23
      • 2012-01-14
      • 1970-01-01
      相关资源
      最近更新 更多