2009-12-09 32 views
28

Tôi đang cố gắng để đọc một tập tin văn bản với độ dài hàng khác nhau:Nhập dữ liệu vào R với số cột không xác định?

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 

Để khắc phục vấn đề này, tôi đang sử dụng lập luận fill = TRUE trong read.table, vì vậy:

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

Thật không may, để đánh giá độ dài hàng tối đa, read.table đọc chỉ 5 dòng đầu tiên của tập tin, và tạo ra một đối tượng tìm kiếm như thế này:

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 

có AW ay để buộc read.table cuộn qua toàn bộ tập tin để đánh giá chiều dài hàng tối đa? Tôi biết một giải pháp khả thi sẽ được cung cấp số cột, như:

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

Nhưng kể từ khi tôi có rất nhiều tác phẩm, tôi muốn đánh giá này tự động trong vòng R. Bất kỳ đề nghị? :-)


EDIT: tập tin gốc không chứa số tiến bộ, vì vậy đây không phải là một giải pháp:

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

bạn có thể đặt một tiêu đề trong file (tức là các tệp có định dạng nhất quán) không? – Shane

+0

Thật không may là không, các tệp được tạo ra bên ngoài và mỗi hàng có thể có số lượng mục nhập ngẫu nhiên. –

Trả lời

55

Có đẹp chức năng count.fields (xem trợ giúp) mà đếm số cột mỗi hàng:

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

Vì vậy, sử dụng giải pháp thứ hai của bạn:

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

Rực rỡ. Thanh lịch và nhanh chóng :-) –

+0

Cuộc gọi tốt. Tôi đã sử dụng R trong hơn một năm và không bao giờ chạy vào chức năng đó, mặc dù nó ở ngay tại phần cuối của tài liệu read.table! –

+0

Tôi ước tôi có thể cung cấp nhiều hơn 1 upvote cho câu trả lời này! Rất hữu ích ! –

5

Sử dụng count.fields chắc chắn là phương pháp phù hợp với điều này, nhưng chỉ cho đầy đủ:

lựa chọn khác là để mang lại tất cả các văn bản thô và phân tích nó trong 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") 

Để kết hợp một danh sách các vectơ chiều dài bất bình đẳng, phương pháp đơn giản nhất là sử dụng các chức năng rbind.fill từ plyr:

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 
Các vấn đề liên quan