我有一个包含两个组和值的数据框。我必须找到max
值的一组(group
)并发现,我的max
对应于第二组(dist
)的值。
# example
df<-data.frame(group = rep(c("a", "b"), each = 5),
val = 1:10,
dist = rep(c("NR", "b1"), 5))
> df
group val dist
1 a 1 NR
2 a 2 b1
3 a 3 NR
4 a 4 b1
5 a 5 NR
6 b 6 b1
7 b 7 NR
8 b 8 b1
9 b 9 NR
10 b 10 b1
我可以按组获取最大值:
aggregate(val ~ group, df, max)
group val
1 a 5
2 b 10
或者通过tapply
:
tapply(df$val, df$group, max)
但我需要知道,在max
所在的“地区”。
group val dist
1 a 5 NR
2 b 10 b1
怎么做到这一点?
我们可以slice
为每个'组'有max
'val'的行
library(dplyr)
df %>%
group_by(group) %>%
slice(which.max(val))
如果存在最大值的关联,则进行比较并对行进行filter
df %>%
group_by(group) %>%
filter(val == max(val))
或者来自ave
的base R
df[with(df, val == ave(val, group, FUN= max)),]
# group val dist
#5 a 5 NR
#10 b 10 b1
df<-data.frame(group = rep(c("a", "b"), each = 5),
val = 1:10,
dist = rep(c("NR", "b1"), 5))
df1 <- split(df, df$group)
df2 <- lapply(df1, function(i) i[which(i$val== max(i$val)),] )
df3 <- do.call(rbind, df2)