我有一个大型数据框/ .csv,它是一个包含42列和110,357,407的矩阵。它是从x和y坐标导出的点的两个数据集,其中一个41和另一个与110357407和行的值表示这两组点之间的距离(上表1中的每个点的距离,以每一个点在清单2)。第一列是一个点列表(从1到110,357,407)。矩阵的摘录如下。
V1 V2 V3 V4 V5 V6 V7
1 38517.05 38717.8 38840.16 38961.37 39281.06 88551.03 88422.62
2 38514.05 38714.79 38837.15 38958.34 39278 88545.48 88417.09
3 38511.05 38711.79 38834.14 38955.3 39274.94 88539.92 88411.56
4 38508.05 38708.78 38831.13 38952.27 39271.88 88534.37 88406.03
5 38505.06 38705.78 38828.12 38949.24 39268.83 88528.82 88400.5
6 38502.07 38702.78 38825.12 38946.21 39265.78 88523.27 88394.97
7 38499.08 38699.78 38822.12 38943.18 39262.73 88517.72 88389.44
8 38496.09 38696.79 38819.12 38940.15 39259.68 88512.17 88383.91
9 38493.1 38693.8 38816.12 38937.13 39256.63 88506.62 88378.38
10 38490.12 38690.8 38813.12 38934.11 39253.58 88501.07 88372.85
11 38487.14 38687.81 38810.13 38931.09 39250.54 88495.52 88367.33
12 38484.16 38684.83 38807.14 38928.07 39247.5 88489.98 88361.8
13 38481.18 38681.84 38804.15 38925.06 39244.46 88484.43 88356.28
14 38478.21 38678.86 38801.16 38922.04 39241.43 88478.88 88350.75
15 38475.23 38675.88 38798.17 38919.03 39238.39 88473.34 88345.23
16 38472.26 38672.9 38795.19 38916.03 39235.36 88467.8 88339.71
我的问题是,我想改变这个矩阵成仅有3列,第一列将类似于与110357407行矩阵的第一列,第二个将是41个数据点(每一个匹配了每个第一点到所有其他点的距离),第三点是这些点之间的距离。所以它看起来像这样
Back Pres Dist
1 1 3486
2 1 3456
3 1 3483
4 1 3456
5 1 3429
6 1 3438
7 1 3422
8 1 3427
9 1 3428
(在完成后面和所有第一个pres值之间的距离之后,pres将变为2并且最终会一直运行到41)
我意识到这将输出极其荒谬的行数,但这是我需要运行R之外的一些进程的格式。
我尝试使用此代码
cols.Output <- data.frame(col = rep(colnames(output3), each = nrow(output3)),
row = rep(rownames(output3), ncol(output3)),
value = as.vector(output3))
但是每列的行数不会相同,所以我收到了一个错误(我认为它不会真正符合我的预柱需求)。我尝试了一些rbind.fill和cbind.fill函数(plyr中的那些函数和其他人在论坛中提出的函数)。我也研究了一些融化和重塑,但我对这些功能感到非常困惑,并且无法弄清楚如何恰当地实现它们(或者它们是否适合我需要的)。我非常感谢你对此的任何帮助,因为我长期以来一直在努力。
编辑:只是为了更加清楚我需要什么。拿这两个较小的数据集
返回&lt; - 具有5组x,y点的数据集
pres&lt; - 具有3组x,y点
的数据集计算这两个数据帧之间的距离会生成初始矩阵:
Back 1 2 3
1 3427 3444 3451
2 3432 3486 3476
3 3486 3479 3486
4 3449 3438 3484
5 3483 3486 3486
我想要的输出看起来像这样:
Back Pres Dist
1 1 3427
2 1 3432
3 1 3486
4 1 3449
5 1 3483
1 2 3444
2 2 3486
3 2 3479
4 2 3438
5 2 3486
1 3 3451
2 3 3476
3 3 3486
4 3 3484
5 3 3486
答案 0 :(得分:2)
是的,看起来这是melt
包中cast
和reshape2
的某种组合通常解决的问题。也就是说,有超过100万行,我不确定这是最有效的方法。
您可以按如下方式手动完成所有操作。我假设您的数据框名为df
,距离在第2列到第42列。看看是否有效。
d <- unlist(df[-1]) # put all the distances into a vector
newdf <- cbind(expand.grid(back=seq_len(nrow(df)), pres=seq_len(ncol(df) - 1)), d)
除非你有大量的记忆,否则这可能会死亡。这同样适用于任何简单的解决方案,因为你有&gt;距离矢量中有42亿个元素。您可以一次处理完整数据集的子集以解决此问题。
答案 1 :(得分:1)
以下是如何在一个小例子中使用melt
:
require(reshape2)
a <- matrix(rnorm(9), nrow = 3)
a[, 1] <- 1:3 ## Pretending these are one set of points
rownames(a) <- a[, 1] ## We'll put them as rownames instead of a column
melt(a[, -1]) ## And omit that column when melting
如果您遇到内存问题,可以编写一个for循环并将其分片,在文件完成后将其写入文件。