如何在R中按超过两个因素分组数据

4

我有一个数据集,看起来像下面这样。实际的数据集中有8619行。

Athlete      Competing Country  Year    Total Medals
Michael Phelps    United States 2012    6
Alicia Coutts     Australia     2012    5
Missy Franklin    United States 2012    5
Brian Leetch      United States 2002    1
Mario Lemieux     Canada        2002    1
Ylva Lindberg     Sweden        2002    1
Eric Lindros      Canada        2002    1
Ulrica Lindström  Sweden        2002    1
Shelley Looney    United States 2002    1

我希望按照国家、年份和奖牌总数重新排列这些数据。

我想要的结果是:

Country        Year  SumOfMedals
United States  2012  11
United States  2002   2
...

by(newmd$Total.Medals, newmd$Year, FUN=sum)
by(md$Total.Medals, md$Competing.Country, FUN=sum)

我尝试使用参数,但仍然卡住了。 有人能帮助我吗?


聚合函数无法正常工作? - Andy Clifton
aggregate(Total.Medals ~ Competing.Country, md, function(x) sum(x)) - tobby
我尝试过这个,但不知道如何同时按国家和年份对数据进行排序。 - tobby
你已经接近成功了。尝试使用aggregate(Total.Medals ~ Competing.Country + Year, md, sum) - Ritchie Sacramento
哦,可以了。谢谢! - tobby
J. Choi - 欢迎来到Stack Overflow!为了以后的参考,您可能会喜欢查看有关提问问题的Q&A,以及有关制作可重现示例的Q&A - Andy Clifton
2个回答

3

或者使用 data.table,我们将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'Competing_Country'、'Year' 进行分组,并获取 'Total_Medals' 的 sum,然后按感兴趣的变量进行排序。

library(data.table)
setDT(df1)[,list(SumOfMedals = sum(Total_Medals)), 
   by = .(Competing_Country, Year)
        ][order(-Competing_Country, -Year, -SumOfMedals)]

使用dplyr也可以采用同样的方法。

library(dplyr)
df1 %>%
    group_by(Competing_Country, Year) %>%
    summary(SumOfMedals = sum(Total_Medals) %>%
    arrange(desc(Competing_Country), desc(Year), desc(SumOfMedals))

数据

 df1 <- structure(list(Athlete = c("Michael Phelps", "Alicia Coutts", 
"Missy Franklin", "Brian Leetch", "Mario Lemieux", "Ylva Lindberg", 
"Eric Lindros", "Ulrica Lindström", "Shelley Looney"), Competing_Country = c("United States", 
"Australia", "United States", "United States", "Canada", "Sweden", 
"Canada", "Sweden", "United States"), Year = c(2012L, 2012L, 
2012L, 2002L, 2002L, 2002L, 2002L, 2002L, 2002L), Total_Medals = c(6L, 
5L, 5L, 1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("Athlete", "Competing_Country", 
"Year", "Total_Medals"), class = "data.frame", row.names = c(NA, 
-9L))

2
您可以使用aggregate轻松地获取奖牌数量的总和:
md2 <- aggregate(cbind(SumOfMedals = Total.Medals) ~ Competing.Country + Year),
          data = md,
          FUN = sum)

下一步是使用order函数按照Competing.CountrySumOfMedalsmd2进行排序:
md2 <- md2[order(Competing.Country, -SumOfMedals),] 

所有操作已完成。


@J.Choi 如果这个方法有效,请考虑通过点击我帖子左侧的绿色箭头将其标记为答案。谢谢! - Andy Clifton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接