2013-06-26 30 views
1

我有一个很大的数据框/ .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列,第一列将类似于与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中的函数和其他人在论坛中提出的函数)。我还研究了一些融化和重塑,但我对这些功能非常困惑,并且无法弄清楚如何适当地实施它们(或者如果它们甚至适合我需要的)。我非常感谢这方面的帮助,因为我一直在努力争取很长时间。

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

背面< - 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  
+0

目前尚不清楚你想要做什么。为什么不在较小的集合中显示问题。例如说,你的维数为3'mat < - matrix(1:9,ncol = 3,byrow = TRUE) v < - - (1:3)'这个例子的预期结果是什么? – agstudy

回答

2

是的,看起来这是在reshape2包中的meltcast的某种组合通常解决的那种问题。也就是说,拥有1亿多行的行,我不确定这是在这种情况下最有效的方法。

您可以手动完成所有操作,如下所示。我假设你的数据帧被称为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亿个元素。您可以一次处理完整数据集的子集以解决此问题。

+0

终于完成了所有这些工作。基本上使用这个代码,但创建了大量的子集,并最终使用data.table包中的rbindlist()将它们全部绑定在一起。花了一段时间,有点混乱,但我想这是大数据有时会发生的事情。 – Misc

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循环,做它切成小块,他们完成了当每个写入文件。

+0

这也可以,谢谢! – Misc