将大距离矩阵改为三列

时间:2013-06-26 18:26:36

标签: r matrix distance

我有一个大型数据框/ .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    

2 个答案:

答案 0 :(得分:2)

是的,看起来这是melt包中castreshape2的某种组合通常解决的问题。也就是说,有超过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循环并将其分片,在文件完成后将其写入文件。