2017-08-04 26 views
0

我试图合并R中的许多csv文件。它们都共享一个共同的列和合并命令工作得很好,当我手动输入两个名称的csv文件。但是,每次我需要执行此操作时,我都有太多文件来输入所有名称。使用ls()作为输入来合并csv文件在R

这只是正常:

test <- merge(quant_dysmorph_data.csv, srs_adult.csv, by = "individual", all 
= TRUE) 

我可以作为合并命令,看起来太细输入类似:

cat(ls(pattern = ".csv"), sep = ",") 

返回: bapq.csv,bapq_raw.csv, bapq_recode.csv,fhi_informant.csv,fhi_interviewer.csv,fhi_subject.csv,quant_dysmorph_data.csv,srs_adult.csv(依此类推等等。抱歉,评论框不会将其格式化为正确的输出...)

然而,当我用这个作为合并命令输入我得到一个错误:

x <- merge(cat(ls(pattern = ".csv"), sep = ","), by = "individual", all = 
TRUE) 

返回:

Error in as.data.frame(y) : argument "y" is missing, with no default 
7.as.data.frame(y) 
6.as.data.frame(y) 
5.nrow(y <- as.data.frame(y)) 
4.merge.data.frame(as.data.frame(x), as.data.frame(y), ...) 
3.merge(as.data.frame(x), as.data.frame(y), ...) 
2.merge.default(cat(ls(pattern = ".csv"), sep = ","), by = "individual", all 
= TRUE) 
1.merge(cat(ls(pattern = ".csv"), sep = ","), by = "individual", all = TRUE) 

在此先感谢您的帮助。

+0

'cat'打印到屏幕上。它返回NULL对象。您可能想要使用data.frames列表。请参阅[本文](https://stackoverflow.com/questions/17499013/how-do-i-make-a-list-of-data-frames)了解更多信息。 – lmo

+0

我之前做过类似这样的事情,我在其自己的子目录中保存了〜40个.csv文件,然后使用setwd()和dir()来获取我要循环的文件名称向量。 –

回答

0

如果需要在解决方案中使用ls(),那么这将无济于事。

但是如果你只是寻找到一个文件夹的完全的.csv的,每其中之一应该由公共变量获得合并合并在一起,那么你可以这样做:用

setwd('Drive:/Folder/Subfolder') 

fnms<-subset(dir(),substr(dir(),nchar(dir())-3,nchar(dir()))=='.csv') 

x<-read.csv(fnms[1]) 

    for (i in 2:length(fnms)){ 
temp<-read.csv(fnms[i]) 
    x <- merge(x,temp, by = "individual", ###or whatever variable you're merging on 

all = TRUE) 
    } 
+0

嗨克里斯托弗, 感谢您的建议。这可行,但会导致最终数据框中的许多列重复。你知道一种保持重复列合并的方法吗? 我试过用dplyr中的连接函数,但是输出包含了NAs而不是我的实际数据 – Brian

+0

rm(list = ls()) filenames < - list.files(path =“./ Father”,full.names = true) import.list < - llply(filenames,read.csv) data < - full_join(as.data.frame(import.list [1]),as.data.frame(import.list [2] )) for(i in 3:length(import.list)){ data < - left_join(data,as.data.frame(import.list [i])) } – Brian

+0

你可以尝试像这样每次迭代在合并之前:current.varnames = names(x)[which(names(x)!=“Individual”)]; temp <-subset(read.csv(fnms [i]),select = which((!(names(x)%in%current.varnames))) –