我希望从位于桌面上的文件夹中读取多个.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
谢谢!
答案 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)