【问题标题】:R: Splitting df, then summarize with dplyrR:拆分df,然后用dplyr汇总
【发布时间】:2015-10-06 03:25:52
【问题描述】:

我有一个很大的 df,我想用 dplyr 命令对其进行总结。但是,我不想要整个 df 的摘要,因为它包含我在不同时间点的数据的快照。所以我要做的是首先按日期列拆分数据,然后在每个子集中进行汇总。我不确定如何将 sapply(或类似的)命令与 dplyr 的常规链接结合起来。

以下是示例数据集。使用此数据的最终目标是获取每个日期的到期年份的金额的总和和百分比。换句话说,我会从分析中得到三个汇总表/df:第一列中的三个日期中的每一个都有一个。

非常感谢您的帮助!

structure(list(Date = structure(c(16596, 16596, 16596, 16266, 
16266, 16266, 15706, 15706, 15706), class = "Date"), amount = c(1, 
5, 10, 11, 20, 3, 4, 6, 2), expirationyear = c(2020, 2030, 2020, 
2022, 2021, 2023, 2021, 2020, 2021)), .Names = c("Date", "amount", 
"expirationyear"), row.names = c(NA, -9L), class = "data.frame")

预期输出(按要求):

表 1:2015-06-10

  1. 2020:11; 11/16
  2. 2030: 5; 5/16

表 2:2014-07-15

  1. 2020:10; 10/41
  2. 2021:20; 20/41
  3. 2022: 11; 11/41

表 3:2013-01-01

  1. 2020: 6; 6/12
  2. 2021: 6; 6/12

我假设这将是一个表列表,但由于我不确定如何实现,我可能错了。

【问题讨论】:

  • 以粗略的方式添加到上面
  • lapply(split(DF, DF$Date), function(dd) dd %>% group_by(expirationyear) %>% summarise(Sum = sum(amount)) %>% mutate(Percent = Sum/sum(Sum)*100))?
  • @docendodiscimus 是的,这看起来是个好方法。在 hadleyverse(带有 magrittr)中,也可以编写像 . %>% ... 这样的函数,而不是 function(dd) dd %>% ...

标签: r dplyr apply


【解决方案1】:

如果你想将数据拆分成一个列表并使用lapply,你可以这样做:

lapply(split(DF, DF$Date), function(dd) {
  dd %>% 
    group_by(expirationyear) %>% 
    summarise(Sum = sum(amount)) %>% 
    mutate(Percent = Sum/sum(Sum)*100)
  })

另一个(和 imo 更简单的)选项是简单地按日期和到期年份分组:

DF %>% 
    group_by(Date, expirationyear) %>% 
    summarise(Sum = sum(amount)) %>% 
    mutate(Percent = Sum/sum(Sum)*100)

【讨论】:

  • 太好了,谢谢!完全同意第二个更简单 - 完全避免需要拆分。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2018-10-22
  • 2017-05-31
  • 2018-04-23
  • 2019-08-20
  • 2016-12-29
相关资源
最近更新 更多