【问题标题】:Aggregate rows by shared values in a variable按变量中的共享值聚合行
【发布时间】:2012-04-18 03:45:33
【问题描述】:

我有一个有点愚蠢的 R 问题。如果我有一个矩阵(或数据框,以更容易使用的为准),例如:

Year  Match
2008   1808
2008 137088
2008      1
2008  56846
2007   2704
2007 169876
2007  75750
2006   2639
2006 193990
2006      2

并且我想将这些年来的每个匹配计数相加(例如,2008 年的行将是 2008 195743,我该怎么做呢?我脑子里有一些解决方案,但它们是所有这些都是不必要的复杂,而 R 往往会在某个地方隐藏一些更简单的解决方案。

您可以使用以下命令生成与上面相同的矩阵:

structure(c(2008L, 2008L, 2008L, 2008L, 2007L, 2007L, 2007L, 
2006L, 2006L, 2006L, 1808L, 137088L, 1L, 56846L, 2704L, 169876L, 
75750L, 2639L, 193990L, 2L), .Dim = c(10L, 2L), .Dimnames = list(
NULL, c("Year", "Match")))

感谢您提供的任何帮助。

【问题讨论】:

标签: r aggregate plyr


【解决方案1】:

aggregate(x = df$Match, by = list(df$Year), FUN = sum),假设df 是您上面的数据框。

【讨论】:

  • 谢谢!我很高兴它就这么简单。
  • 你也可以使用data参数来避免每次都写df,此外,你还可以使用公式样式:aggregate(Match ~ Year, FUN = sum, data=df);)
【解决方案2】:

您可能还想使用“plyr”包中的“ddply”功能。

# install plyr package
install.packages('plyr')
library(plyr)
# creating your data.frame
foo <- as.data.frame(structure(c(2008L, 2008L, 2008L, 2008L, 2007L, 2007L, 2007L, 
            2006L, 2006L, 2006L, 1808L, 137088L, 1L, 56846L, 2704L, 169876L, 
            75750L, 2639L, 193990L, 2L), .Dim = c(10L, 2L), .Dimnames = list(
              NULL, c("Year", "Match"))))

# here's what you're looking for
ddply(foo,.(Year),numcolwise(sum))

  Year  Match
1 2006 196631
2 2007 248330
3 2008 195743

顺便说一句,2008 年的总和应该是 195743 (1808+137088+1+56846),而不是 138897,你忘了加 56846。

【讨论】:

  • 谢谢。我想有一种方法可以用 plyr 做到这一点,所以我将其标记为这样。
【解决方案3】:

如上所述,您可以使用聚合来执行以下操作。但以更简单的方式

aggregate(. ~ Year, df, sum)
#  Year  Match
#1 2006 196631
#2 2007 248330
#3 2008 195743

你也可以使用Dplyr来解决这个问题

library(dplyr)
df %>% group_by(Year) %>% summarise(Match = sum(Match))
#  Year  Match
#  (int)  (int)
#1  2008 195743
#2  2007 248330
#3  2006 196631

【讨论】:

  • 我有几十个列,所以在你想要做所有列而不是列出每一列的情况下,这真的很简洁。
猜你喜欢
  • 2019-02-18
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多