大量行之间的差异

时间:2013-06-12 12:09:07

标签: r data.table

我有一个矩阵,行数非常多,只有两个成对的列。我想计算第1列中每行之间的差异,如果差异小于预定义值(.001),则计算两列中这些行的平均值。例如,我有一个名为权重的矩阵

  A      B
185.0765 10
185.3171 20
186.0777 30
186.0780 40
188.0078 50

weights<-as.data.table(weights)
bins<-weights[A %between% c(A[3],(A[3]+.001))]
meanA<-mean(bins$A)
meanB<-mean(bins$B)

,结果矩阵将是,

  A      B
185.0765 10
185.3171 20
186.0779 35
188.0078 50

如果有人可以建议我如何为大量行做这件事,我将感激不尽。我认为使用for循环效率不高。

1 个答案:

答案 0 :(得分:6)

这应该使用data.table

实现您的目标
DT <- data.table( weights )
DT[ , Group :=( cumsum( c( 1 , ifelse( diff(weights$A) < 0.001 , 0 , 1 ) ) ) ) ]
DT[ , lapply(.SD, mean) , by=Group ,  .SDcols = c("A","B") ]
#   Group        A  B
#1:     1 185.0765 10
#2:     2 185.3171 20
#3:     3 186.0779 35
#4:     4 188.0078 50

我们的想法是使用累积和来查找具有<&lt; 1}的差异的A组。 0.001。如果差异低于此阈值,我们会在0列中添加Group,因此在累计金额中,它将成为同一组的一部分。

正如 @eddi 所建议的那样,更简洁有效的方法是在一次通话中同时进行分组和计算:

DT <- data.table( weights )
DT[ , lapply(.SD, mean) , by = list(Group = cumsum(c(1,diff(A)) >= 0.001)) ,  .SDcols = c("A","B") ]    

顺便说一句,拥有绝对行数总是有帮助的。 非常大数量的行对不同的人和用例意味着不同的东西。我们在谈论百万吗?数亿?