2009-12-09 43 views
28

我試圖讀取不同的行長度的文本文件:將數據導入到列數未知的R中?

1 
1 2 
1 2 3 
1 2 3 4 
1 2 3 4 5 
1 2 3 4 5 6 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 8 

爲了克服這個問題,我使用的參數填充= TRUE函數read.table中,所以:

data<-read.table("test",sep="\t",fill=TRUE) 

不幸的是,以評估最大行長度,讀出函數read.table只有第5行的文件,並生成對象看起來像這樣:

data 
    V1 V2 V3 V4 V5 
1 1 NA NA NA NA 
2 1 2 NA NA NA 
3 1 2 3 NA NA 
4 1 2 3 4 NA 
5 1 2 3 4 5 
6 1 2 3 4 5 
7 6 NA NA NA NA 
8 1 2 3 4 5 
9 6 7 NA NA NA 
10 1 2 3 4 5 
11 6 7 8 NA NA 

有AW ay強制read.table滾動整個文件以評估最大行長度? 我認識的一個可能的解決方案,以提供列數,如:

data<-read.table("test",sep="\t",fill=TRUE,col.names=c(1:8)) 

但因爲我有很多文件,我想在R自動評估這什麼建議嗎? :-)


編輯:原文件不包含漸進的數字,所以這不是一個解決方案:

data1<-read.table("test",sep="\t",fill=TRUE) 
data2<-read.table("test",sep="\t",fill=TRUE,col.names=c(1:max(data1)) 
+0

你可以把一個頭文件中(即文件是否具有一致的格式)? – Shane 2009-12-09 15:11:21

+0

不幸的是,這些文件是外部生成的,每行可以有一個隨機數的條目。 – 2009-12-09 15:13:16

回答

55

有很好的功能count.fields(見幫助),其對列的數每行:

count.fields("test", sep = "\t") 
#[1] 1 2 3 4 5 6 7 8 

因此,使用你的第二個解決方案:

no_col <- max(count.fields("test", sep = "\t")) 
data <- read.table("test",sep="\t",fill=TRUE,col.names=1:no_col) 
data 
# X1 X2 X3 X4 X5 X6 X7 X8 
# 1 1 NA NA NA NA NA NA NA 
# 2 1 2 NA NA NA NA NA NA 
# 3 1 2 3 NA NA NA NA NA 
# 4 1 2 3 4 NA NA NA NA 
# 5 1 2 3 4 5 NA NA NA 
# 6 1 2 3 4 5 6 NA NA 
# 7 1 2 3 4 5 6 7 NA 
# 8 1 2 3 4 5 6 7 8 
+0

輝煌。優雅而快速:-) – 2009-12-09 15:24:27

+0

良好的通話。我已經使用R一年多了,從來沒有遇到這個功能,即使它在read.table文檔的最後也是如此! – 2009-12-09 19:40:04

+0

我希望我能給這個答案超過1個upvote!非常有用! – 2013-02-11 22:28:39

5

使用count.fields絕對是這個正確的方法,但只是爲了完整性:

另一種選擇是在所有的原始文本,使和R內解析它:

x <- readLines(textConnection(
"1\t 
1\t2 
1\t2\t3 
1\t2\t3\t4 
1\t2\t3\t4\t5 
1\t2\t3\t4\t5\t6")) 
x <- strsplit(x,"\t") 

要結合列表長度不等的載體,最簡單的方法是使用從plyrrbind.fill功能:

library(plyr) 
# requires data.frames with column names 
x <- lapply(x,function(x) {x <- as.data.frame(t(x)); colnames(x)=1:length(x); return(x)}) 
do.call(rbind.fill,x) 
1 2 3 4 5 6 
1 1 <NA> <NA> <NA> <NA> <NA> 
2 1 2 <NA> <NA> <NA> <NA> 
3 1 2 3 <NA> <NA> <NA> 
4 1 2 3 4 <NA> <NA> 
5 1 2 3 4 5 <NA> 
6 1 2 3 4 5 6