Pregunta

There are so many posts on how to get the group-wise min or max with SQL. But how do you do it in R?

Let's say, you have got the following data frame

ID | t | value
a | 1 | 3
a | 2 | 5
a | 3 | 2
a | 4 | 1
a | 5 | 5
b | 2 | 2
b | 3 | 1
b | 4 | 5

For every ID, I don't want the min t, but the value at the min t.

ID | value
a | 3
b| 2
¿Fue útil?

Solución

df is your data.frame -

library(data.table)

setDT(df) # convert to data.table in place

df[, value[which.min(t)], by = ID]

Output -

> df[, value[which.min(t)], by = ID]
   ID V1
1:  a  3
2:  b  2

Otros consejos

You are looking for tapply:

df <- read.table(textConnection("
ID | t | value
a | 1 | 3
a | 2 | 5
a | 3 | 2
a | 4 | 1
a | 5 | 5
b | 2 | 2
b | 3 | 1
b | 4 | 5"), header=TRUE, sep="|")

m <- tapply(1:nrow(df), df$ID, function(i) {
  df$value[i[which.min(df$t[i])]]
})
# a  b
#  3  2

Two more solutions (with sgibb's df):

sapply(split(df, df$ID), function(x) x$value[which.min(x$t)])

#a  b  
#3  2 

library(plyr)
ddply(df, .(ID), function(x) x$value[which.min(x$t)])

#  ID V1
#1 a   3
#2 b   2
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top