我想从多个文件夹中合并R中的多个.txt
文件。但是,当我想将数据分为不同的列时,我遇到了麻烦。现在,这些文件合并在一起,但是应该有四列时合并为一列。
我使用list.files
在工作目录的文件夹中找到.txt
个文件。然后,我使用rbind
和lapply
将它们与read.delim
结合在一起。 (见下文)
files = list.files(pattern = "*.txt")
myfiles = do.call(rbind, lapply(files, function(x) read.delim(x, header = FALSE, stringsAsFactors = FALSE)))
上面的代码合并了所有.txt
文件,但是每个文件的前3行都是数据下载的工件(基本上只是命名功能),与数据本身无关。因此,一旦文件合并,三行就会重复。我无法使用filter()
,因为我必须手动浏览数据(成千上万行)。我还想在另一个具有类似设置的文件夹中重复此过程。因此,我希望能够使用相同的代码。
我认为我可以通过在合并每个.txt
文件之前删除它们的前3行来解决此问题。然后,我可以设置header = FALSE
并在文件合并后仅添加标题。但是同样,有数百个文件,因此我不希望手动执行此操作。不过,我不确定如何执行此操作。有什么建议么?
谢谢您的帮助。
答案 0 :(得分:0)
从评论中抄录的选项:
read.delim(..., skip = 3)
将自己删除这些前导重复行。这也会删除标题行,因此您所有的框架都将具有通用的列名,这不是什么大问题。read.delim(..., nrows=1)
重新读取其中一个文件的第一行(第一?)以获取列名。如果我们使用nrows=0
,它将读取所有内容,因此我们至少需要1来限制读取的行;在注释中,我加入了[0,]
,但是由于您只需要列名,所以它并不会真正影响到事情。您可以使用以下类似的方法第一次使用它:
files = list.files(pattern = "*.txt")
myfiles = do.call(rbind, lapply(files, function(x) read.delim(x, skip = 3, header = FALSE, stringsAsFactors = FALSE)))
# added this part ^^^^^^^^^
colnames(myfiles) <- colnames(read.delim(files[1], header=TRUE, nrows=1))