2014-09-22 71 views
0

我正在處理12個大型數據文件,所有這些文件都在3到5 GB之間懸停,因此我轉向使用RSQLite進行導入和初始選擇。在這種情況下給出一個可重複的例子是很困難的,所以如果你能想出任何東西,那就太好了。Read.table和dbWriteTable導致不同的輸出?

如果我拿一小部分數據,讀它,並將其寫入到一個表,我得到正是我想要的:

con <- dbConnect("SQLite", dbname = "R2") 
f <- file("chr1.ld") 
open(f) 
data <- read.table(f, nrow=100, header=TRUE) 
dbWriteTable(con, name = "Chr1test", value = data) 

> dbListFields(con, "Chr1test") 
[1] "row_names" "CHR_A"  "BP_A"  "SNP_A"  "CHR_B"  "BP_B"  "SNP_B"  "R2"  

> dbGetQuery(con, "SELECT * FROM Chr1test LIMIT 2") 
    row_names CHR_A BP_A  SNP_A CHR_B BP_B  SNP_B   R2 
1   1  1 1579 SNP-1.578.  1 2097 SNP-1.1096. 0.07223050 
2   2  1 1579 SNP-1.578.  1 2553 SNP-1.1552. 0.00763724 

如果我在我所有的數據直接讀取到表,但是,我的列沒有正確分隔。我都試過月=「」和SEP =「\ t」的,但都給予同樣的柱分離

dbWriteTable(con, name = "Chr1", value ="chr1.ld", header = TRUE) 
> dbListFields(con, "Chr1") 
[1] "CHR_A_________BP_A______________SNP_A__CHR_B_________BP_B______________SNP_B___________R 

我可以告訴大家,它顯然是某種delimination問題的,但我已經用盡了我的想法如何解決它。有沒有人遇到過這個?

*編輯,更新: 它好像這個工程:

n <- 1000000 
f <- file("chr1.ld") 
open(f) 
data <- read.table(f, nrow = n, header = TRUE) 

con_data <- dbConnect("SQLite", dbname = "R2") 
while (nrow(data) == n){ 
    dbWriteTable(con_data, data, name = "ch1", append = TRUE, header = TRUE) 
    data <- read.table(f, nrow = n, header = TRUE) 
} 
close(f) 
if (nrow(data) != 0){ 
    dbWriteTable(con_data, data, name = "ch1", append = TRUE) 
} 

雖然我不能完全弄清楚爲什麼剛剛經歷寫的SQLite表是一個問題。可能是一個記憶問題。

+0

如果'read.table(f,nrow = 100,header = TRUE)'爲100,是否確切地知道它在哪個值停止工作?當您剛剛讀取100行時,您是否比較了'data'的'str()'?導入可能有問題。但是,由於您沒有提供[可重現的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),因此無法確切知道什麼是繼續。我們只能猜測。 – MrFlick 2014-09-22 16:29:47

+0

read.table(f,nrow = 100,header = TRUE)可以工作,並且我得到100行完全符合我的預期。由於文件非常龐大,我無法提供可重複使用的示例,並且這似乎是導致錯誤的原因。否則我可以提供文件,但不能用較小的集重新創建此錯誤。 – MHtaylor 2014-09-22 19:00:49

回答

1

我猜你的大文件導致了一個空閒的內存問題(請參閱文檔中的內存使用情況read.table)。向我們展示chr1.ld的前幾行會很有幫助(在* nix系統上,您只需說出「head -n 5 chr1.ld」即可獲得前五行)。 如果這是一個內存問題,那麼你可以嘗試將該文件作爲解決方案,而不是吞噬整個文件。 確定或估計chr1.ld中的行數(在* nix系統上,例如「wc -l chr1.ld」)。 假設你的文件有100,000行。

`sip.size = 100 
for (i in seq(0,100000,sip.size)) { 
    data <- read.table(f, nrow=sip.size, skip=i, header=TRUE) 
    dbWriteTable(con, name = "SippyCup", value = data, append=TRUE) 
}` 

您可能會在最後看到警告,但數據應該通過。如果你有字符數據,read.table試圖去考慮因素,那麼這個kludge將不會令人滿意,除非只有少數因素,所有這些都是保證在每個塊中都會發生的。您可能需要告訴read.table不要考慮這些列或使用其他方法來查看所有可能的因素,以便可以列出它們以供read.table使用。 (在* nix上,分出一列並將其傳送到uniq。)

+0

我想我想出了一些非常相似的東西,雖然我想這會起作用。我的數據大約有5300萬行,所以這可能是問題所在 – MHtaylor 2014-09-25 11:16:37