我有一个中等大小的数据库(约 400,000 行,27 列),我需要使用相同的比较标准搜索大部分列(其中 25 列)。我认为将数据重塑/融合为“长”格式会更有效,因此我使用了 reshape2 包来生成 ~9,000,000 行/4 列数据集。除了花费很长时间(我只有 2GB 的 RAM)之外,重新调整后的文件大小非常巨大:500MB。
是否有更有效/计算量更少的方法:
- 重塑和存储从宽到长的数据?
- 完全避免重塑并仍然使用相同的搜索条件搜索多个列?
详细说明我的评论,除了@Matthew 已经描述的内容之外,数据压缩可能在您获得如此不同的文件大小的原因中发挥了不错的作用。
例如看这个:
set.seed(1234)
A <- matrix(runif(1000), 1000, 1000, byrow = TRUE)
A <- A + runif(5)
B <- t(A)
save(A, file="A.RData")
save(B, file="B.RData")
这两个数据结构包含相同A
的B
数据但转置,但文件大小完全不同:
file.info("B.RData")$size / file.info("A.RData")$size
# [1] 97.38222
为什么?似乎 R 的压缩算法(在大多数情况下)是按列探索数据。
如果我查看@Matthew 的示例,每个单独的列conc.*
对我来说看起来非常随机,即难以压缩,尽管原始列conc
对于压缩算法可能看起来不那么随机。
This can happen.
From ?reshape
summary(Indometh)
wide <- reshape(Indometh, v.names = "conc", idvar = "Subject",
timevar = "time", direction = "wide")
> dim(Indometh)
[1] 66 3
> dim(wide)
[1] 6 12
> 66*3 # long
[1] 198
> 6*12 # wide
[1] 72
What's happening, is that you have repeated values in the long format (here, Subject
and time
):
> head(Indometh)
Subject time conc
1 1 0.25 1.50
2 1 0.50 0.94
3 1 0.75 0.78
4 1 1.00 0.48
5 1 1.25 0.37
6 1 2.00 0.19
> wide
Subject conc.0.25 conc.0.5 conc.0.75 conc.1 conc.1.25 conc.2 conc.3 conc.4 conc.5 conc.6 conc.8
1 1 1.50 0.94 0.78 0.48 0.37 0.19 0.12 0.11 0.08 0.07 0.05
12 2 2.03 1.63 0.71 0.70 0.64 0.36 0.32 0.20 0.25 0.12 0.08
23 3 2.72 1.49 1.16 0.80 0.80 0.39 0.22 0.12 0.11 0.08 0.08
34 4 1.85 1.39 1.02 0.89 0.59 0.40 0.16 0.11 0.10 0.07 0.07
45 5 2.05 1.04 0.81 0.39 0.30 0.23 0.13 0.11 0.08 0.10 0.06
56 6 2.31 1.44 1.03 0.84 0.64 0.42 0.24 0.17 0.13 0.10 0.09