将大量未清理的数据有效地读入R中

时间:2014-05-28 03:56:55

标签: r large-data

我正在尝试对大型数据集(大约8千万行9列)进行计算,但问题是数据集未清理包含9个不需要的行(具有不同的no和列类型)每2280行重复一次实际数据行。

尝试了从基本(read.table)到sqldf,ff,data.frame的不同选项,但是无法只读取实际数据并且对R添加了新内容。工作选项是 read.table(文件) ,跳过= 9,填充= T)并在此后对其进行分组,但这是读取不需要的行并花费时间并耗尽我的记忆。研究并研究了100个小时阅读pdf但没有详细解释或难以像我这样的初学者

看起来像:

ITEM: TIMESTEP  
0  
ITEM: NUMBER OF ATOMS  
2280  
ITEM: BOX BOUNDS pp pp pp  
-6.16961 6.16961  
-6.16961 6.16961  
-6.16961 6.16961  
ITEM: ATOMS id mol type x y z ix iy iz   
1 1 1 -0.31373 3.56934 -0.560608 1 -1 6   
2 1 1 0.266159 3.08043 -1.20681 1 -1 6   
3 1 1 1.07006 3.55954 -1.09484 1 -1 6   

我希望通过在每22 22行中跳过前9行而不耗尽内存来读取9列值。

规格: Windows 8 x64,4 GB RAM,512 GB SSD,双核 x64 R

2 个答案:

答案 0 :(得分:3)

fread() / data.table解决方案:

根据我的评论4Gigs将会紧张,因此您可能需要通过指定nrow= fread()参数来批量执行此操作。

例如:

您提供的数据样本:

smp <- "ITEM: TIMESTEP  
0  
ITEM: NUMBER OF ATOMS  
2280  
ITEM: BOX BOUNDS pp pp pp  
-6.16961 6.16961  
-6.16961 6.16961  
-6.16961 6.16961  
ITEM: ATOMS id mol type x y z ix iy iz   
1 1 1 -0.31373 3.56934 -0.560608 1 -1 6
2 1 1 0.266159 3.08043 -1.20681 1 -1 6
3 1 1 1.07006 3.55954 -1.09484 1 -1 6"

首先我们在文件中读取,但只使用sep="\n"按行分隔。

library( data.table )

all_lines <- fread(smp, sep="\n", header=FALSE)

然后我们放弃了我们不想要的线条。请注意,您可以使用重复的行索引模式替换c(1:9)。我不清楚这是什么,所以我把它留给你。

good_lines <- all_lines[-c(1:9)]

然后我们将其折叠回一个带有paste0(, collapse="\n")的大字符串:

collapsed <- paste0(good_lines$V1, collapse="\n")

然后我们通过在此字符串上调用fread()来捕获预期格式:

what_I_want <- fread(collapsed,header=FALSE)

在这种情况下,结果是:

what_I_want
# V1 V2 V3        V4      V5        V6 V7 V8 V9
# 1:  1  1  1 -0.313730 3.56934 -0.560608  1 -1  6
# 2:  2  1  1  0.266159 3.08043 -1.206810  1 -1  6
# 3:  3  1  1  1.070060 3.55954 -1.094840  1 -1  6

答案 1 :(得分:0)

我建议在Windows上下载Cygwin64。您可以对大型数据集进行快速处理,并将块发送到可以在R中处理的文件。这是一个例子,

从shell中删除前9行,然后将其余行发送到"myFile2.txt",其中"myFile.txt"是原始数据

$ tail -n +10 myFile.txt > myFile2.txt 

然后,在R

> read.table('myFile2.txt')
#   V1 V2 V3        V4      V5        V6 V7 V8 V9
# 1  1  1  1 -0.313730 3.56934 -0.560608  1 -1  6
# 2  2  1  1  0.266159 3.08043 -1.206810  1 -1  6
# 3  3  1  1  1.070060 3.55954 -1.094840  1 -1  6