如何读取多个.csv文件,合并并创建新列?

时间:2017-08-24 01:07:47

标签: r

我希望从位于桌面上的文件夹中读取多个.csv文件,将所有这些.csv文件合并到一个data.frame中,并创建一个包含每个文件名称的列。

我试过了:

my.path <- "C:/Users/JB/Desktop/RawFiles/"
filenames <- paste(my.path, list.files(path=my.path), sep="/")
my.df <- do.call(rbind, lapply(filenames, function(x) cbind(read.csv(x), name=strsplit(x,'\\.')[[1]][1])))

但是,my.dt$name不包含.csv的文件名。相反,它包含文件的位置。例如,head(my.dt, 3)生成:

 name
1 C:/Users/JB/Desktop/RawFiles//Analysis_01122016
2 C:/Users/JB/Desktop/RawFiles//Analysis_01122016
3 C:/Users/JB/Desktop/RawFiles//Analysis_01122016

如何编辑,my.dt$name只生成file.name?我的预期输出是:

name
    1 Analysis_01122016
    2 Analysis_01122016
    3 Analysis_01122016

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,您不需要为路径使用变量; full.names = TRUE的{​​{1}}参数将为您做到这一点。

如果您只想要文件名和扩展名,可以使用:

list.files

如果你想删除扩展名:

basename("full/path/to/myfile.csv")

所以你可以用你的代码做这样的事情:

tools::file_path_sans_ext(basename("full/path/to/myfile.csv"))

但是使用filenames <- list.files(path = "C:/Users/JB/Desktop/RawFiles", full.names = TRUE) my.df <- do.call(rbind, lapply(filenames, function(x) cbind(read.csv(x), name = tools::file_path_sans_ext(basename(x))))) plyr::ldply等工具有更清晰的解决方案,您可以通过正确的搜索在其他答案中找到示例。

答案 1 :(得分:0)

您可以使用strsplit()拆分“/”上的文件路径,并获取结果向量的最后一个元素。

files <- list.files("~/Dropbox/structure_simulations/str_in/k2",full.names = T)

df <- lapply(files,function(e) {
  tmp <- read.csv(e)
  name <- unlist(strsplit(e,"/"))[length(unlist(strsplit(e,"/")))] 
  name <- unlist(strsplit(name,"\\."))[1]
  tmp$name <- name
  tmp
  })
df <- do.call(rbind,df)