【问题标题】:How to summarise a table by 2 columns in R如何在 R 中按 2 列汇总表
【发布时间】:2015-07-12 18:59:07
【问题描述】:

我想通过按期间对第 1 个分组,按付款人 ID 对第 2 个分组来总结此数据集,以便按月将结果显示为任何给定用户的小计,如下所示:

data.frame:

Payer   Period
1   10  1-1015
2   15  2-1015
3   14  3-1015
1   1   1-1015
3   5   1-1015
1   7   4-1015
3   8   4-1015
1   4   5-1015

结果应该是这样的:

Payer   Period
1   11  1-1015
3   5   1-1015
2   15  2-1015
3   14  3-1015
1   7   4-1015
3   8   4-1015
1   4   5-1015

最好的方法是什么?谢谢!

【问题讨论】:

  • 您的意思是先按期间订购,然后按付款人订购?
  • $ 是列名吗? (我在编辑中删除了它,因为我认为它是错误的)
  • 您缺少一个列名。如果有ID列,aggregate(Payer~ID+Period, df1, FUN=sum)
  • 让我们调用缺少的中间列名称Amount...
  • 真的取决于你所说的 best 是什么意思。如果您想通过灵活的语法快速完成此操作,请查看data.table package tutorials(@akrun 的答案)。另请参阅benchmarks on grouping

标签: r aggregate split-apply-combine


【解决方案1】:

假设有三列,你可以只做aggregate

 aggregate(Amount~., df1, FUN=sum)
 #    Payer Period Amount
 #1     1 1-1015     11
 #2     3 1-1015      5
 #3     2 2-1015     15
 #4     3 3-1015     14
 #5     1 4-1015      7
 #6     3 4-1015      8
 #7     1 5-1015      4

或者

 library(data.table)#v1.9.5+
 setDT(df1)[, list(Amount=sum(Amount)), .(Period, Payer)]
 #    Period Payer Amount
 #1: 1-1015     1     11
 #2: 2-1015     2     15
 #3: 3-1015     3     14
 #4: 1-1015     3      5
 #5: 4-1015     1      7
 #6: 4-1015     3      8
 #7: 5-1015     1      4

使用不同的顺序

 aggregate(Amount~., df2, FUN=sum)
 #  Payer Period Amount
 #1     1 1-1015     11
 #2     3 1-1015      5
 #3     2 2-1015     15
 #4     3 3-1015     14
 #5     1 4-1015      7
 #6     3 4-1015      8
 #7     1 5-1015      4

数据

 df1 <- structure(list(Payer = c(1L, 2L, 3L, 1L, 3L, 1L, 3L, 1L), 
 Amount = c(10L, 
 15L, 14L, 1L, 5L, 7L, 8L, 4L), Period = c("1-1015", "2-1015", 
 "3-1015", "1-1015", "1-1015", "4-1015", "4-1015", "5-1015")),
 .Names = c("Payer", 
  "Amount", "Period"), class = "data.frame", row.names = c(NA, -8L))

 set.seed(24)
 df2 <- df1[sample(nrow(df1)),]

【讨论】:

  • 这依赖于具有所有条目的数据集,这些条目按 Period, Payer 递增的顺序排列。如果任何条目不是,结果将是无序的。
  • @smci。我认为这两种情况都不是真的。 aggregatedata.table.[ 的“by”参数都不要求它们的参数按组排序。
  • 我认为@smci 正在考虑 sas :}
  • 天哪,我不会碰 SAS 或 SPSS。
【解决方案2】:
require(dplyr)
df %>% group_by(Period,Payer) %>%
    summarize(Amount = sum(Amount)) %>%
    ungroup() # this should ungroup by the last grouped var, i.e. Payer

# if that doesn't work, then add an explicit %>% arrange(Period, Payer)

【讨论】:

  • 您选择使用它而不是 aggregate 有什么原因吗?
  • @theamaturdataanalyst:我认为聚合没有给出按期间、付款人的明确排序(正如 OP 所要求的那样)。但确实如此。所以这只是一个相当于聚合的 dplyr。 dplyr(/data.table) 对于高基数分组(即大文件)几乎肯定会表现得更好。
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2021-10-13
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多