4

我有一个矩阵,行数非常多,只有两对成对的列。我想计算第 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 循环不会很有效。

4

1 回答 1

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

这个想法是我们使用累积和来找到A差异小于 0.001 的组。如果差值低于此阈值,我们将 a0Group列中,因此在累积总和中,它将属于同一组。

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

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

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

于 2013-06-12T12:37:05.873 回答