将R中的文本文件与不同的分隔符相结合

时间:2015-11-17 03:35:08

标签: r

我正在尝试读入并将多个文本文件合并到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或其他连接函数可能有用,但我还需要同时加载数据,并且不确定如何在读取命令中设置它。

2 个答案:

答案 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")})