我正在尝试读入并将多个文本文件合并到R.这个问题是我得到了一些数据,其中文件之间的字段分隔符不同(例如,一个标签和另一个标记的标签)。我怎么能有效地结合这些?布局的一个例子:
Data1(标签):
v1 v2 v3 v4 v5
1 2 3 4 urban
4 5 3 2 city
Data2(逗号):
v1,v2,v3,v4,v5
5,6,7,8,rural
6,4,3,1,city
这个例子显然不真实,真正的代码有近五十万分!因此无法重塑原始文件。我到目前为止使用的代码是:
filelist <- list.files(path = "~/Documents/", pattern='.dat', full.names=T)
data1 <- ldply(filelist, function(x) read.csv(x, sep="\t"))
data2 <- ldply(filelist, function(x) read.csv(x, sep=","))
这给了我两种方式的数据,然后我需要手动清理然后组合。有没有办法以一种可以删除它的方式使用sep
?列名在文件中是相同的。我知道stringr
或其他连接函数可能有用,但我还需要同时加载数据,并且不确定如何在读取命令中设置它。
答案 0 :(得分:2)
我建议使用&#34; data.table&#34;中的fread
。包。它速度很快,并且能够自动检测文件中的分隔符。
以下是一个例子:
## Create some example files
cat('v1\tv2\tv3\tv4\tv5\n1\t2\t3\t4\turban\n4\t5\t3\t2\tcity\n', file = "file1.dat")
cat('v1,v2,v3,v4,v5\n5,6,7,8,rural\n6,4,3,1,city\n', file = "file2.dat")
## Get a character vector of the file names
files <- list.files(pattern = "*.dat") ## Use what you're already doing
library(data.table)
lapply(files, fread)
# [[1]]
# v1 v2 v3 v4 v5
# 1: 1 2 3 4 urban
# 2: 4 5 3 2 city
#
# [[2]]
# v1 v2 v3 v4 v5
# 1: 5 6 7 8 rural
# 2: 6 4 3 1 city
## Fancy work: Bind it all to one data.table...
## with a column indicating where the file came from....
rbindlist(setNames(lapply(files, fread), files), idcol = TRUE)
# .id v1 v2 v3 v4 v5
# 1: file1.dat 1 2 3 4 urban
# 2: file1.dat 4 5 3 2 city
# 3: file2.dat 5 6 7 8 rural
# 4: file2.dat 6 4 3 1 city
答案 1 :(得分:1)
您还可以在函数中添加if
子句:
data = ldply(filelist,function(x) if(grepl(",",readLines(x,n=1))){read.csv(x,sep=",")} else{read.csv(x,sep="\t")})