7

给定以下测试矩阵:

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、名称组合):

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

4 回答 4

7

data.table时间和内存效率以及语法优雅的解决方案

library(data.table)
DT <- as.data.table(testMatrix)
DT[,list(Name = Name[which.max(Value)]),by = GroupID] 
于 2012-09-27T01:17:06.407 回答
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)
于 2012-08-20T15:35:35.407 回答
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)])
于 2012-08-20T15:22:08.040 回答
0

我想出了一个通过 dplyr 做到这一点的好方法

filter(group_by(testMatrix,GroupID),min_rank(desc(Value))==1)
于 2014-10-16T03:44:15.350 回答