4

我有一个大数据框/.csv,它是一个包含 42 列和 110,357,407 的矩阵。它来自两个点数据集的 x 和 y 坐标,一个具有 41,另一个具有 110,357,407,行的值表示这两组点之间的距离(列表 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 列,第一列将类似于具有 110,357,407 行的矩阵的第一列,第二列将是 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

(在 back 和 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)) 

但是每列的行数不会相同,所以我收到了一个错误(我认为它不会真正满足我的 pres 列需求)。我尝试使用一些 rbind.fill 和 cbind.fill 函数(plyr 中的函数和其他人在论坛中提出的函数)。我还研究了一些融合和重塑,但我对这些功能非常困惑,无法弄清楚如何适当地实现它们(或者它们是否适合我的需要)。我真的很感激这方面的任何帮助,因为我已经为此苦苦挣扎了很长时间。

编辑:只是为了更清楚我需要什么。拿这两个较小的数据集

返回 <- 1 个数据集,包含 5 组 x​​、y 点

pres <- 1 个数据集,包含 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    
4

2 回答 2

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)

除非你有大量的内存,否则这可能会死。但是,对于任何简单的解决方案也是如此,因为距离向量中有 > 42 亿个元素。您可以一次处理完整数据集的子集来解决此问题。

于 2013-06-26T18:48:11.650 回答
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 循环并分段执行,完成后将每个循环写入文件。

于 2013-06-26T18:52:41.580 回答