组合许多csv文件,将文件名保留在R中

时间:2018-04-13 01:24:54

标签: r

我有一个包含许多csv文件的文件夹。每个csv文件具有相同的列数。我想结合它们创建一个文件名列。我已经看过类似的帖子,但我无法让它发挥作用。我正在尝试以下脚本。任何帮助将不胜感激

library(plyr)
csvfilenames <- list.files("/Users/PAM/Desktop/CSVFilesToMerge/",
                           pattern="*.csv", all.files=FALSE, full.names=FALSE)
csvfilenames

library(plyr)
CombinedData = ldply(csvfilenames, function(filename) {
dum = read.table(filename, header=TRUE, fill = TRUE, sep=";")
dum$Filename = csvfilenames
return(dum)
})
CombinedData`

这是我对purrr的下一次尝试,但它不起作用

library(readr) # for read_csv()
library(purrr) #for map(), reduce()

data_path<-"/Users/PAM/Desktop/TestCSVFilesToMerge/"

files <- dir(data_path, pattern = "*.csv") # get file names
files


data <- files %>% # read in all the files, appending the path before the filename
map(~ read_csv(file.path(data_path, .))) %>% 
reduce(rbind)
data

3 个答案:

答案 0 :(得分:0)

这应该可以满足您的需求,

csvfilenames <- list.files("/Users/PAM/Desktop/CSVFilesToMerge/",
                       pattern="*.csv", all.files=FALSE, full.names=FALSE)

for(i in 1:length(csvfilenames))
{
temp<-read.csv(paste(csvfilenames[i])) #give path if its not your wd
temp$filename_tag<-paste(csvfilenames[i])

list[[i]]<-temp
}

outfile<-as.data.frame(do.call(rbind,list))

答案 1 :(得分:0)

我设法让它发挥作用。但是,我想知道是否有人可以帮我清理一下脚本。此脚本还会转置数据,因此我必须手动删除所有创建的额外行(每列一个)。我认为当我在数据框中转换列表时,问题出现在脚本的最后一行。

csvfilenames <- list.files("/Users/carlos/Desktop/TestCSVFilesToMerge/",
                   pattern="*.csv", all.files=FALSE, full.names=FALSE) #creates a list with the file names
csvfilenames

for(i in 1:length(csvfilenames))  

{
a=csvfilenames[i]
temp1<-read.csv(file=paste("/Users/carlos/Desktop/TestCSVFilesToMerge/",a,sep=""),sep=";", header=T)
temp2<-cbind("FileName"=a,temp1[,1:ncol(temp1)]) #add a column called FileName in position 1

list[[i]]<-temp2
}

outfile<-as.data.frame(do.call(rbind,list))
outfile

答案 2 :(得分:0)

类似于上述情况,我有2个已读取的csv文件 CSV1:

2016 2016 2017 2017 2018 2018年     值%vs. PY值%vs. PY值%vs. PY 数据1 2018-09 23663 2,757 5.7%
Data2 2018-08 7687686 15.1% Data2 2018-09 987987 15.2%

CSV2: 2016 2016 2017 2017 2018 2018年     值%vs. PY值%vs. PY值%vs. PY Data1 2018-09 456 3000 4%

我也想添加文件名作为列名。 我使用以下:

x1= read.csv(choose.files(),F,"\t", skipNul = FALSE)
x2= read.csv(choose.files(),F,"\t", skipNul = FALSE)
merged_files= do.call(rbind, list(x1= x1, x2= x2))

,但在每行中加x1。 CNA有人帮忙吗? 我尝试使用上面的代码,但在文件(文件,“ rt”)中给我错误:   无法打开文件。