有很多关于如何使用SQL获取组的最小值或最大值的文章。在R中如何实现?假设您有以下 Dataframe
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,我不需要最小值t,而是最小值t处的值。
ID | value a | 3 b| 2
snz8szmq1#
df是您的数据。frame -
df
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
xpszyzbs2#
您正在寻找tapply:
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
olmpazwi3#
还有两种解决方案(使用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
3条答案
按热度按时间snz8szmq1#
df
是您的数据。frame -输出-
xpszyzbs2#
您正在寻找
tapply
:olmpazwi3#
还有两种解决方案(使用SGIBB的DF):