2015-11-17 41 views
2

我想讀入並將多個文本文件合併爲R.與此問題是,我已經給出了一些數據,其中文件之間的字段分隔符是不同的(例如一個標籤和另一個逗號)。我怎樣纔能有效地結合這些? (標籤)R中的文本文件與不同分隔符

數據1::(逗號)

v1 v2 v3 v4 v5 
1 2 3 4 urban 
4 5 3 2 city 

數據2:佈局的例子

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

你試過'fread'從 「data.table」 作爲替代'閱讀.csv'?它通常可以通過掃描文件來自動檢測分隔符。 – A5C1D2H2I1M1N2O1R2T1

回答

2

我建議使用「data.table」包中的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 
+0

感謝您的建議 - fread包真的很有幫助! – GeeMiss

1

您還可以添加if條款到您的函數:

data = ldply(filelist,function(x) if(grepl(",",readLines(x,n=1))){read.csv(x,sep=",")} else{read.csv(x,sep="\t")}) 
+1

這是一個好主意(+1),但我會謹慎使用'grep'。也許'count.fileds'是一個更好的選擇,類似於:'lapply(files,function(x)if(count.fields(textConnection(readLines(x,1)),sep =「,」)[1] == 5)read.csv(x)else read.delim(x))'。 – A5C1D2H2I1M1N2O1R2T1

+0

謝謝〜但是你有什麼擔心,你的意思是grep可能無法準確檢測到分隔符?我喜歡你的read.delim(),順便說一句:) – Gentlezerg

+0

我想這不太可能是一個標題將標籤或逗號作爲數據,所以我的警告可能是沒有根據的......這似乎是有道理的使用「read.table」在底層使用了什麼,特別是因爲它給了我們一些方便驗證的東西,因爲我們知道源數據結構...... – A5C1D2H2I1M1N2O1R2T1

相關問題