Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find max per group and return another column

Given the following test matrix:

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

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

Here I want to find the max per group and then return the name of that column. E.g. I would expect 1, A and 2, C. If there is a tie with max, the first match would be fine. After that I would have to attach this to the matrix with a new Column "GroupName"

How can I do this?

I already have the Group, Max Value combination:

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

The way I used to add columns to my matrix works like this (let's assume there is also already a matrix groupNames with GroupID, Name combinations):

testMatrix <- cbind ( testMatrix, groupNames[match( testMatrix[,1], groupNames[,1] ), 2] ) 
like image 508
BaseBallBatBoy Avatar asked Aug 20 '12 14:08

BaseBallBatBoy


People also ask

How do you get a record with maximum value for each group?

MySQL MAX() function with GROUP BY retrieves maximum value of an expression which has undergone a grouping operation (usually based upon one column or a list of comma-separated columns).

What does Groupby Max do?

max. Compute max of group values. Include only float, int, boolean columns.

How do you find the columns maximum value in every row?

To create the new column 'Max', use df['Max'] = df. idxmax(axis=1) . To find the row index at which the maximum value occurs in each column, use df. idxmax() (or equivalently df.


1 Answers

A data.table solution for time and memory efficiency and syntactic elegance

library(data.table)
DT <- as.data.table(testMatrix)
DT[,list(Name = Name[which.max(Value)]),by = GroupID] 
like image 197
mnel Avatar answered Sep 26 '22 02:09

mnel