查找每组最大值并返回另一列

时间:2012-08-20 14:35:40

标签: r matrix greatest-n-per-group

给出以下测试矩阵:

testMatrix <- matrix( c(1,1,2,10,20,30,300,100,200,"A","B","C"), 3, 4)

colnames(testMatrix) <- c("GroupID", "ElementID", "Value", "Name")

在这里,我想找到每组的最大值,然后返回该列的名称。 例如。我希望1,A和2,C。如果与max有关系,第一场比赛就没问题了。 之后,我将不得不使用新的列“GroupName”

将其附加到矩阵

我该怎么做?

我已经拥有Group,Max Value组合:

groupMax <- aggregate (as.numeric(testMatrix[,3]), by=list( testMatrix[,1] ), max )

我过去在矩阵中添加列的方式就像这样(让我们假设还有一个矩阵groupNames,其中包含GroupID,Name组合):

testMatrix <- cbind ( testMatrix, groupNames[match( testMatrix[,1], groupNames[,1] ), 2] ) 

4 个答案:

答案 0 :(得分:6)

data.table解决方案,提高时间和记忆效率以及句法优雅

library(data.table)
DT <- as.data.table(testMatrix)
DT[,list(Name = Name[which.max(Value)]),by = GroupID] 

答案 1 :(得分:5)

基础解决方案,不像Dan M那样简单:

testMatrix <- data.frame(GroupID = c(1,1,2), ElementID = c(10,20,30), 
    Value=c(300,100,200), Name=c("A","B","C"))

A <- lapply(split(testMatrix, testMatrix$GroupID), function(x) {
        x[which.max(x$Value), c(1, 4)]
    }
)
do.call(rbind, A)

答案 2 :(得分:0)

正如@Tyler所说,data.frame更容易使用。这是一个选项:

testMatrix <- data.frame(GroupID = c(1,1,2), ElementID = c(10,20,30), Value=c(300,100,200), Name=c("A","B","C"))
ddply(testMatrix, .(GroupID), summarize, Name=Name[which.max(Value)])

答案 3 :(得分:0)

我通过dplyr

找到了一个很好的方法
filter(group_by(testMatrix,GroupID),min_rank(desc(Value))==1)