2015-04-17 19 views
3

我需要將一個非常大的製表符分隔的文本文件讀入R(大約兩千兆字節)。問題是該文件包含大量重複的選項卡(兩個後續選項卡之間沒有任何內容)。他們似乎會引起麻煩,因爲他們(有些?)被解釋爲線路的終點。R:以數據形式讀取具有複製標籤的製表符分隔文件

由於數據量很大,我上傳了一小部分來說明問題,請參閱下面的代碼。

count.fields(file = "http://m.uploadedit.com/ba3c/1429271380882.txt", sep = "\t") 
read.table(file = "http://m.uploadedit.com/ba3c/1429271380882.txt", 
     header = TRUE, sep = "\t") 

感謝您的幫助。

編輯

編輯:該示例沒有完全說明原始問題。對於整個數據,我應該每行總共有6312個字段,但是當我對其執行count.fields()時,行會在4571 - 1741 - 4571 - 1741 - ...模式中分解,因此需要額外的行尾後場號4571.

+0

你知道推進你應該有多少列? – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto我將它添加到問題 – NoBackingDown

回答

1

檢查你的文件的報價和評論字符。默認行爲是不計算引號內(或註釋之後)的製表符或其他分隔符。因此,您每行的字段數保持不變並且2個值添加到正確的數字這一事實表明您在每行上的字段4570後有一個引號字符。因此,第一行讀取第一個4570記錄,看到該報價並將該行的其餘部分和下一行的前4570個字段作爲單個字段讀取,然後將第二行上剩餘的1741行讀取爲單個字段,並重復第3行和第4行等。

count.fieldsread.tableread.table有相關函數來設置引用字符和註釋字符。將它們改爲空字符串會告訴R忽略引號和註釋,這是測試我的理論的一種快速方法。

+0

我確實檢查過,事實並非如此。 – NoBackingDown

+0

@Dominik,第4570個標籤之後的是什麼?另一種選擇是,在那一點插入了一個額外的換行符,並且您確實想要將兩行讀爲一行。 'scan'的'multi.line'參數可以幫助解決這個問題。 –

+0

我現在實際上懷疑它確實插入了一條新線。我試過這個:'read.table(file = fpath,sep =「\ t」,head = TRUE,nrows = 2,quote =「」, comment.char =「」)''沒有成功。 – NoBackingDown

0

好吧,我沒有找到問題的根源,但我想你已經在表中複製了rownames。我把你的數據加載到R workspace中。

to.load = readLines("http://m.uploadedit.com/ba3c/1429271380882.txt") 
data = read.csv(text = to.load, sep = "\t", nrows=length(to.load) - 1, row.names=NULL) 
2

似乎有\n字符串隨機分散在整個列名稱中。如果我們看一下使用substr()gregexpr()文件中的第5個左右發生\n,結果看起來很奇怪:

library(readr) # useful pkg to read files 
df <- read_file("http://m.uploadedit.com/ba3c/1429271380882.txt") 

> substr(df, gregexpr("\n", df)[[1]][1]-10, gregexpr("\n", df)[[1]][1]+10) 
[1] "1-024.Top \nAlleles\tCF" 

> substr(df, gregexpr("\n", df)[[1]][2]-10, gregexpr("\n", df)[[1]][2]+10) 
[1] "053.Theta\t\nCFF01-053." 

> substr(df, gregexpr("\n", df)[[1]][3]-10, gregexpr("\n", df)[[1]][3]+10) 
[1] "CFF01-072.\nTop Allele" 

> substr(df, gregexpr("\n", df)[[1]][4]-10, gregexpr("\n", df)[[1]][4]+10) 
[1] "CFF01-086.\nTheta\tCFF0" 

> substr(df, gregexpr("\n", df)[[1]][5]-10, gregexpr("\n", df)[[1]][5]+10) 
[1] "ype\tCFF01-\n303.Top Al" 

所以,這個問題顯然不是兩個後續\t,但隨機分佈的換行符。這顯然會導致read.table解析器崩潰。但是:如果隨機分散的換行符是問題,那麼我們將它們全部刪除並將它們插入正確的位置。以下代碼將正確讀取發佈的示例數據。你可能會需要拿出更好的正則表達式爲ID_REF變量自動與\n ID字符串的情況下,ID字符串變化之前替換它多在示例數據:

library(readr) 

df <- read_file("http://m.uploadedit.com/ba3c/1429271380882.txt") 

df <- gsub("\n", "", df) 
df <- gsub("abph1", "\nabph1", df) 
df <- read_delim(df, delim = "\t") 
+0

是的,我認爲問題的根源在行內換行。 – NoBackingDown

+1

@Dominik,我重新編輯了我的答案,以提供完整的工作解決方案。讓我知道它是否適用於您,並考慮接受它,如果解決您的問題。 – Felix

+0

感謝您的幫助,但數據太大,無法一次性記錄到內存中。我最終通過使用'scan'來讀取數千行代碼塊並手動處理換行符(原始數據中每個「行」只有一個,不知道爲什麼樣本中有這麼多)。儘管如此,感謝您的支持! – NoBackingDown

相關問題