我有一个中等大小的数据库(~400,000行,27列),我需要在大多数列(其中25列)中搜索具有相同的比较标准。我认为将数据重塑/融化为“long”格式会更有效,因此我使用reshape2包生成~9,000,000行/ 4列数据集。除了花费很长时间(我只有2GB的RAM),重新整形的文件大小是巨大的:500MB。
是否有更高效/更少计算密集的方式:
答案 0 :(得分:5)
阐述我的评论,除了@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
看起来可能不太适合压缩算法。
答案 1 :(得分:4)
这可能发生。
来自?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
发生了什么,是你有长格式的重复值(这里是Subject
和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