【问题标题】:Aggregating values based on 2 separate columns基于 2 个单独的列聚合值
【发布时间】:2018-10-29 14:00:02
【问题描述】:

我有一个 df(部分列在下面)。

    account    company           sum
1    202003         B01        40.50
2    208001         B01    -71596.73
3    280250         B01     -6652.70
4    200001         B13     44362.77
5    202001         B13     13874.25
6    204001         B13      5744.20
7    204102         B13       295.00
8    285091         B13    317145.15
9    286101         B13     11471.13
10   298001         B13    396096.50

我正在尝试根据以下条件将 df1$sum 列中的数字添加到新数据框中: 对于每个公司(B01B13),我需要为 df1$accounts 中以 ^20 开头的所有帐户聚合列 df1$sum,并将其命名为 df2$Expenses1(因此在此示例中为 202003208001 代表公司 B01)。

另外,我需要汇总所有以 ^28 和 ^29 开头的帐户,并将其命名为 df2$Expenses2(因此对于公司 B01,它只会是帐户 280250,对于公司 B13,它将是285091286101298001 的帐户总和。

最终,新的数据框df2 应该如下所示:

Company   Expenses1   Expenses2
 B01     -71,556.23    -6,652.7
 B13      64,276.22  724,712.78    

非常感谢您对此的帮助!

【问题讨论】:

  • 你试过什么?我们有一个很好的R-FAQ on "How to sum by group?"。对您来说唯一的区别是您需要先取一个子集 - 以“20”开头的帐号子集,然后按组求和;子集以“28”或“29”开头的帐号,然后按组求和。
  • 如果您在“以 X 开头的帐号”部分需要帮助,我建议您使用 substr 函数提取前两位数字并对其进行测试。您还可以使用带有grepl 的正则表达式模式,例如"^2[89]"
  • aggregate(sum ~ company + grepl("^20", account), data=df1, FUN=sum)

标签: r dataframe aggregate


【解决方案1】:

使用 tidyverse

library(tidyverse)
df %>% 
  group_by(company) %>% 
  summarise(Expenses1 = sum(sum*grepl('^20', account)),
            Expenses2 = sum(sum*grepl('^28|^29', account)))
# # A tibble: 2 x 3
#   company Expenses1 Expenses2
#   <chr>       <dbl>     <dbl>
# 1 B01        -71556   -  6653
# 2 B13         64276    724713

有数据表

library(data.table)
setDT(df)

df[, lapply(c(Expenses1 = '^20', 
              Expenses2 = '^28|^29'), 
            function(patt) sum(sum*grepl(patt, account)))
   , by = company]

#    company Expenses1 Expenses2
# 1:     B01 -71556.23   -6652.7
# 2:     B13  64276.22  724712.8

如果你真的只有两个组,你可以创建另一个分组变量,然后使用 dcastspread 例如

df[, .(Expenses = sum(sum))
   , by = .(company, 
            acct_type = paste0('Expenses_', ifelse(grepl('^20', account), '20', 'other')))] %>% 
  dcast(company ~ acct_type)


#    company Expenses_20 Expenses_other
# 1:     B01   -71556.23        -6652.7
# 2:     B13    64276.22       724712.8

【讨论】:

  • 我认为前两个版本会更好,因为我可能需要向数据框添加更多条目并以不同方式对它们进行分组。尽管如此,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多