我正在尝试对大型数据集(大约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
答案 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