2014-09-22 43 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