2017-05-04 59 views
0

我的问题是关于Extract the maximum value within each group in a dataframe在R数据框的每个组(C列)内给出列B中的最大值,提取列A中的值?

  • 问题的根本在于:如何根据同一数据框中单独列中的重复组选择最大值?

  • 在为如何完成这个任务后,用户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 
    

我知道我可以使用任何的答案,从上面提到的电子数据交换的帖子,然后只用类似whichmatchsapply找出年份,但这似乎太渺茫。

是否有一种快速的方法来提取列A中的值,给定数据框中每个组(列C)中B列的最大值?

更新:可能有人请提供基础R解决方案?

+0

请说明您downvote。这个问题写得相当好,它提供了一个例子,它是关于主题的,它展示了以前的努力和搜索,并且恰如其分地遵循了规则(即,在评论中提出了一个新问题,并提出了后续问题)。是什么赋予了?! – theforestecologist

+1

添加基础R解决方案以回答下面。 –

+0

谢谢,@KristofferWintherBalling – theforestecologist

回答

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 
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 
相关问题