2013-05-16 76 views
5

?read.table中指出:函數read.table更改用來確定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’). 

我需要使用fill paramenter和我的一些txt文件可能有行第五排之後的列數最多。我不能使用標題,只是因爲我沒有它,並且col.names將在導入後定義,所以我想將這5個R用於整個文件中,(我沒有記住任何速度損失,我可以得到)。任何建議?謝謝!

編輯:

剛剛發現這個在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) 

代碼我可以改變上面的代碼中的第4行數5?是否會對read.table行爲產生任何副作用?

編輯2:我目前使用

這種方法

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

有列的最大數量,並把結果來創建虛擬col.namespaste0("V", seq_len(maxCol))。你認爲仍然值得有另一個read.table有可能選擇那個?

+0

如果你指定通過'colClasses'閱讀哪些列關於什麼的? –

+0

嗨,事情是。我不知道列的數量(有很多文件要導入,每行有不同數量的列,所以我使用'fill')。在調用'read.table'之前,我可以運行'scan'並檢查'max(col)',但是對於可以選擇要掃描的行數的代碼,一個硬編碼的'5') – Michele

+0

@RomanLuštrik請檢查我的編輯,謝謝 – Michele

回答

4

使用count.fields,例如,

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

謝謝!再一次,我從未見過的有用功能在SO上發佈。 –

+0

你好!謝謝。好答案!我在改進我的EDIT2解決方案的同時做了max(unlist(lapply(gregexpr(「,」,readLines(files [j])),length)))'。但你的它更加優雅和緊湊。這也是一個bt更快,但我不介意這個任務的速度,因爲我有(很多)非常小的文件。 – Michele

+0

有一個問題:使用'colClasses'我想我會繞過試圖在'read.table'中分配類的腳本。將類設置爲「NA」將輸出爲全部字符列?謝謝。 – Michele