结合ldply以结合多个csv文件,并通过mutate / basename添加带有文件名的列

时间:2019-06-12 07:33:17

标签: r csv

我正在尝试在which uses ldply to combine multiple csv files into one dataframe

处应用代码

我正在尝试找出合适的tidyverse语法是什么,以添加一列以列出数据来源文件的名称。

这就是我所拥有的

test <- ldply( .data = list.files(pattern="*.csv"),
              .fun = read.csv,
               header = TRUE) %>%
  mutate(filename=gsub(".csv","",basename(x)))

我知道

  

“ basename(x)中的错误:找不到对象'x'消息”。

我的理解是该基本名(路径),但是当我将路径设置为包含文件的文件夹时,最后被添加的文件名列仅具有文件夹名称。

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您可以使用purrr::map_dfr

purrr::map_dfr(list.files(pattern="*.csv", full.names = TRUE),
    ~read.csv(.x) %>% mutate(file = sub(".csv$", "", basename(.x))))

答案 1 :(得分:0)

我们可以使用imap

library(purrr)
library(dplyr)
library(stringr)
library(readr)
files <- list.files(pattern="*.csv", full.names = TRUE)
fileSub <- str_remove(basename(files), "\\.csv$")
imap_dfr(setNames(files, fileSub), ~ read_csv(.x) %>%
          mutate(file = .y))

答案 2 :(得分:0)

我不知道这是否对任何人有帮助,我偶然发现了这个非常简单的解决方案。

上下文:由 ldply 创建的 .id 列列出了输入向量中每个项目的名称。因此,要合并多个 csv 文件并使用文件名创建一个新列,您可以执行以下操作:

# get csv files in current working directory as a character vector
file_names <- list.files(pattern="*.csv") #for the example above it is .data=list.files(pattern="*.csv")

# Name these items (in this case equal to the items themselves, but can be subbed out for sample.Ids)
names(file_names) <- paste(file_names) # or for the example above names(.data) <- paste(.data)

# then use ldply to do the hard work
combined_csv <- ldply(file_names, read.csv)

# Names are stored under .id
combined_csv$.id