我正在尝试使用R合并wd中的所有“.txt”文件,并在每行的末尾附加原始文件名。现在我正在运行一个看起来像这样的for循环:
xfiles = list.files(pattern = "\\.txt$")
combinedfiles = data.frame()
for (currentFile in xfiles){
filex = read.delim(currentFile,sep="\t",header=T,fill=T)
filex$File.name = rep(currentFile,nrow(filex))
combinedfiles = merge(combinedfiles,filex,all=T)
rm(filex)
}
循环运行,并正确输出 combinedfiles 变量,但每次运行时都会输出遗漏一个文件(例如如果wd中存在4个txt文件,则在输出中只合并3个)。当一个文件位于wd中时,没有行合并到组合文件中,但列名称将添加到空白的合并文件数据框中。
有没有人知道我在合并时遇到了什么问题?
谢谢!
答案 0 :(得分:2)
当您与空data.frame合并时,不会返回任何行,但它会为每个表添加列。并且由于第一个表没有列,因此它返回第二个表的列。观察
dd<-data.frame()
d1<-data.frame(a=1:3, b=4:6)
d2<-data.frame(a=1:3, c=4:6)
merge(dd, d1)
# [1] a b
# <0 rows> (or 0-length row.names)
merge(merge(dd, d1), d2)
# [1] a b c
# <0 rows> (or 0-length row.names)
我真的很惊讶你得到任何行。所有这些文件是否共享一个公共列以进行合并?你确定merge
吗?是正确的操作?
您可以先检查是否存在现有行,而不是将第一个data.frame合并为空。
for (currentFile in xfiles){
filex = read.delim(currentFile,sep="\t",header=T,fill=T)
filex$File.name = rep(currentFile, nrow(filex))
if( nrow(combinedfiles)>0 ) {
combinedfiles = merge(combinedfiles,filex,all=T)
} else {
combinedfiles = filex
}
rm(filex)
}