在给定R数据帧中每个组(C列)中B列的最大值的情况下,在A列中提取一个值?

时间:2017-05-04 19:39:28

标签: r dataframe aggregate subset

我的问题与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帖子中的任何答案,然后使用类似whichmatchsapply的内容来计算年份,但这似乎太草率了。

在给定数据框中每个组(C列)中B列的最大值的情况下,是否可以快速提取A列中的值?

更新:有人可以提供基本R解决方案吗?

2 个答案:

答案 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