2013-05-16 66 views
5

Trong ?read.table được tuyên bố rằng:Thay đổi số hàng read.table sử dụng để xác định số lượng cột trong R

The number of data columns is determined by looking at the first five lines of input 
(or the whole file if it has less than five lines), or from the length of col.names 
if it is specified and is longer. This could conceivably be wrong if fill or 
blank.lines.skip are true, so specify col.names if necessary (as in the ‘Examples’). 

tôi cần phải sử dụng fill paramenter và một số file txt của tôi có thể có hàng với số cột cao nhất sau hàng thứ 5. Tôi không thể sử dụng tiêu đề, chỉ vì tôi không có nó và col.names sẽ được xác định sau khi nhập, vì vậy tôi muốn thay đổi 5 hàng R được sử dụng trong toàn bộ tệp, (tôi không nhớ bất kỳ mất mát tốc độ nào tôi có thể nhận được). Bất kì lời đề nghị nào? Cảm ơn!

EDIT:

chỉ thấy điều này trong mã của read.table

if (skip > 0L) 
    readLines(file, skip) 
nlines <- n0lines <- if (nrows < 0L) 
    5 
else min(5L, (header + nrows)) 
lines <- .External(C_readtablehead, file, nlines, comment.char, 
    blank.lines.skip, quote, sep) 
nlines <- length(lines) 

tôi có thể chỉ cần thay đổi số 5 trong các hàng thứ 4 của mã trên? sẽ có bất kỳ tác dụng phụ nào đối với hành vi read.table?

EDIT 2:

Tôi hiện đang sử dụng phương pháp này

maxCol <- max(sapply(readLines(filesPath), function(x) length(strsplit(x, ",")[[1]]))) 

có số lượng tối đa của cột, và đưa kết quả để tạo ra hình nộm col.names như paste0("V", seq_len(maxCol)). Bạn có nghĩ rằng vẫn còn giá trị để có một read.table khác với khả năng chọn điều đó?

+0

gì về nếu bạn chỉ định các cột để đọc qua 'colClasses'? –

+0

Xin chào, điều này là. Tôi không biết trước số cột (có nhiều tệp để nhập, với các cột số khác nhau cho mỗi hàng, vì vậy tôi sử dụng 'điền'). Tôi có thể chạy một 'quét' và kiểm tra' max (col) 'trước khi gọi' read.table', nhưng nó sẽ phù hợp hơn (với tôi) có khả năng chọn số dòng cần quét (thay cho mã cứng '5') – Michele

+0

@ RomanLuštrik vui lòng kiểm tra chỉnh sửa của tôi, cảm ơn – Michele

Trả lời

4

Sử dụng count.fields, ví dụ,

read.table(filesPath, colClasses=rep(NA, max(count.fields(filesPath))), fill=TRUE) 
+1

Cảm ơn! Một lần nữa, một hàm hữu ích mà tôi chưa từng thấy được đăng trên SO. –

+0

hi ya! cảm ơn. câu trả lời tốt! Tôi đã cải thiện giải pháp EDIT2 của tôi trong thời gian có nghĩa là làm 'max (unlist (lapply (gregexpr (", ", readLines (files [j])), chiều dài)))'. Nhưng của bạn nó thanh lịch và nhỏ gọn hơn nhiều. Đó cũng là một bt nhanh hơn, nhưng tôi không nhớ tốc độ quá nhiều cho công việc này, vì tôi đã có (rất nhiều) tập tin rất nhỏ. – Michele

+0

một câu hỏi: sử dụng 'colClasses' tôi đoán tôi sẽ bỏ qua kịch bản cố gán các lớp trong' read.table'. Việc đặt các lớp thành 'NA' sẽ xuất ra tất cả các cột ký tự? cảm ơn. – Michele

Các vấn đề liên quan