我有一个矩阵,行数非常多,只有两个成对的列。我想计算第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循环效率不高。
答案 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") ]
顺便说一句,拥有绝对行数总是有帮助的。 非常大数量的行对不同的人和用例意味着不同的东西。我们在谈论百万吗?数亿?