我的问题与Extract the maximum value within each group in a dataframe有关。
问题主要在于:如何根据同一数据框中单独列中的重复组选择一列中的最大值?
在该帖子中,用户EDi provides a ton of examples了解如何完成此任务。
我的问题:如何完成相同的任务,但是我没有报告最大值,而是报告与该最大值相关联的第三列中的值?
例如:
假设我有一个data.frame:
Group Value Year
A 12 1933
A 10 2010
B 3 1935
B 5 1978
B 6 2011
C 1 1954
D 3 1933
D 4 1978
对于我的分组变量的每个级别,我希望提取发生最大值的年。因此,结果应该是一个数据框,每个级别的分组变量有一行:
Group Year
A 1933
B 2011
C 1954
D 1978
我知道我可以使用上面提到的EDi帖子中的任何答案,然后使用类似which
,match
或sapply
的内容来计算年份,但这似乎太草率了。
在给定数据框中每个组(C列)中B列的最大值的情况下,是否可以快速提取A列中的值?
更新:有人可以提供基本R解决方案吗?
答案 0 :(得分:2)
library(dplyr)
df %>% group_by(Group) %>% slice(which.max(Value)) %>% select(-Value)
#Source: local data frame [4 x 2]
#Groups: Group [4]
# Group Year
# <fctr> <int>
#1 A 1933
#2 B 2011
#3 C 1954
#4 D 1978
请注意,如果存在关系,则每个组只保留一个最大值。
保持最大值绑定的方法:
library(dplyr)
df %>% group_by(Group) %>% filter(Value == max(Value)) %>% select(-Value)
#Source: local data frame [4 x 2]
#Groups: Group [4]
# Group Year
# <fctr> <int>
#1 A 1933
#2 B 2011
#3 C 1954
#4 D 1978
答案 1 :(得分:1)
以下是基础R和data.table
解决方案:
df <- structure(list(Group = c("A", "A", "B", "B", "B", "C", "D", "D"
), Value = c(12L, 10L, 3L, 5L, 6L, 1L, 3L, 4L), Year = c(1933L,
2010L, 1935L, 1978L, 2011L, 1954L, 1933L, 1978L)), .Names = c("Group",
"Value", "Year"), row.names = c(NA, -8L), class = "data.frame")
# Base R - use aggregate to get max Value per group, then merge with df
merge(df, aggregate(Value ~ Group, df, max), by.all = c("Group", "Value"))[
, c("Group", "Year")]
# Group Year
# 1 A 1933
# 2 B 2011
# 3 C 1954
# 4 D 1978
# data.table solution
library(data.table)
dt <- data.table(df)
dt[, .SD[which.max(Value), .(Year)], by = Group]
# Group Year
# 1: A 1933
# 2: B 2011
# 3: C 1954
# 4: D 1978