关于如何使用SQL获取分组最小值或最大值的帖子太多了。但你怎么在R?
做到这一点我们说,您有以下数据框
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
对于每个ID,我都不想要最小值,但是最小值的值。
ID | value
a | 3
b| 2
答案 0 :(得分:5)
df
是您的data.frame -
library(data.table)
setDT(df) # convert to data.table in place
df[, value[which.min(t)], by = ID]
输出 -
> df[, value[which.min(t)], by = ID]
ID V1
1: a 3
2: b 2
答案 1 :(得分:3)
您正在寻找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
答案 2 :(得分:0)
另外两个解决方案(使用sgibb的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