R中的聚合函数同时使用两列

Posted

技术标签:

【中文标题】R中的聚合函数同时使用两列【英文标题】:Aggregate function in R using two columns simultaneously 【发布时间】:2016-09-07 12:17:15 【问题描述】:

数据:-

df=data.frame(Name=c("John","John","Stacy","Stacy","Kat","Kat"),Year=c(2016,2015,2014,2016,2006,2006),Balance=c(100,150,65,75,150,10))

   Name Year Balance
1  John 2016     100
2  John 2015     150
3 Stacy 2014      65
4 Stacy 2016      75
5   Kat 2006     150
6   Kat 2006      10

代码:-

aggregate(cbind(Year,Balance)~Name,data=df,FUN=max )

输出:-

   Name Year Balance
1  John 2016     150
2   Kat 2006     150
3 Stacy 2016      75

我想使用 Year 和 Balance 两列来聚合/汇总上述数据框。我使用基本函数 aggregate 来执行此操作。我需要最近一年/最近一年的最大余额。输出的第一行,John 有最近的一年 (2016) 但余额是 (2015) ,这不是我需要的,它应该输出 100 而不是 150。我在哪里出错了?

【问题讨论】:

【参考方案1】:

有点讽刺的是,aggregate 是一个糟糕的聚合工具。你可以让它工作,但我会这样做:

library(data.table)

setDT(df)[order(-Year, -Balance), .SD[1], by = Name]
#    Name Year Balance
#1:  John 2016     100
#2: Stacy 2016      75
#3:   Kat 2006     150

【讨论】:

【参考方案2】:

我会建议使用库 dplyr:

data.frame(Name=c("John","John","Stacy","Stacy","Kat","Kat"),
           Year=c(2016,2015,2014,2016,2006,2006),
           Balance=c(100,150,65,75,150,10)) %>% #create the dataframe
    tbl_df() %>% #convert it to dplyr format
    group_by(Name, Year) %>% #group it by Name and Year
    summarise(maxBalance=max(Balance)) %>% # calculate the maximum for each group
    group_by(Name) %>% # group the resulted dataframe by Name
    top_n(1,maxBalance) # return only the first record of each group

【讨论】:

不错,但我会使用@eddi 答案的副本:df %>% group_by(Name) %>% arrange(desc(Year),desc(Balance)) %>% filter(1) @MaratTalipov 不错的答案!【参考方案3】:

这是另一个没有 data.table 包的解决方案。

先对数据框进行排序,

df <- df[order(-df$Year, -df$Balance),]

然后选择每个组中同名的第一个

df[!duplicated[df$Name],]

【讨论】:

以上是关于R中的聚合函数同时使用两列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPA 的两列上运行像 SUM 这样的聚合函数并显示它们的结果?

Terra R - 使用自定义函数加速栅格数据的聚合()

优化 R 中的时间序列聚合

sql中的 开窗函数over() 聚合函数 排名函数

R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和使用tapply函数按组聚合求和按组聚合求和(使用dplyr包)

r R聚合DataIt使用一个或多个BY变量和一个已定义的函数相对容易地折叠R中的数据.http://www.statmetho