在每列中查找k个最高值并计算R的平均值

在每列中查找k个最高值并计算R的平均值

问题描述:

我正在尝试使用top k值计算数据帧中每列的平均值。我有一个解决方案,但是,它是缓慢和hamfisted。以下是我想出了:在每列中查找k个最高值并计算R的平均值

predictMat <- matrix(0,nrow = length(colnames(DT)),ncol = 1) 
k <- 100 

itemSummary <- for(i in colnames(DT)) { 
    u <- data.frame(DT[,i , drop = F]) 
    sortU1 <- data.frame(u[order(u[,i], decreasing = T),, drop = F]) 
    u1Neighbors <- data.matrix(sortU1[1:k,, drop = F]) 
    predictMat[i] <- mean(u1Neighbors, na.rm = T) 
} 

您可以在一个行中使用apply功能做到这一点:

# Sample data frame 
set.seed(144) 
DT <- matrix(rnorm(1000), nrow=100) 
k <- 10 

# Compute average of 10 largest values in each column 
apply(DT, 2, function(x) mean(tail(sort(x), k))) 
# [1] 1.721765 1.658917 1.630231 1.558280 1.606363 1.526322 1.810814 1.678135 
# [9] 1.541305 1.621984 
+0

喜欢它。简单而优雅,谢谢。 – bstockton 2014-08-28 22:40:03

可以用背到后端应用功能

set.seed(100) 
x <- as.data.frame (matrix(runif(5000,0,10), nrow=1000,ncol=5)) 

x1<- apply(x,2,sort,decreasing=T) 
apply(x1[1:100,],2,mean) 


     V1  V2  V3  V4  V5 
9.548000 9.572912 9.422325 9.547370 9.462894 
做到这一点

编辑:看起来像我在我的答案后面几秒钟!

+0

由于您要在'x1'中存储数据的第二个副本,因此如果您有一个包含多行的数据集,这可能会非常低效。 – josliber 2014-08-28 22:39:39