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」でマトリックスに添付する必要があります

これどうやってするの?

グループと最大値の組み合わせを既に持っています。

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

マトリックスに列を追加するために使用した方法は、次のように機能します (グループ ID と名前の組み合わせを持つマトリックス groupNames も既に存在すると仮定します)。

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 に答える