【问题标题】:Summing all columns by group [duplicate]按组对所有列求和[重复]
【发布时间】:2021-01-27 18:51:21
【问题描述】:

我很肯定这是一个非常简单的答案,但我似乎无法理解使用多个条件进行聚合或强制转换

我有一个如下所示的表格:

> head(df, n=10L)
   STATE  EVTYPE FATALITIES INJURIES
1     AL TORNADO          0       15
3     AL TORNADO          0        2
4     AL TORNADO          0        2
5     AL TORNADO          0        2
6     AL TORNADO          0        6
7     AL TORNADO          0        1
9     AL TORNADO          1       14
11    AL TORNADO          0        3
12    AL TORNADO          0        3
13    AL TORNADO          1       26

显然,这种情况还在继续……我想做的是按状态和 EVTYPE 折叠死亡人数和受伤人数,所以如果这 10 行是我的 ful 数据集,结果将是一个单行数据框:

   STATE  EVTYPE FATALITIES INJURIES
1     AL TORNADO          2       74

我的完整框架有许多状态和许多 EVTYPE

【问题讨论】:

  • 试试 dplyr df %>% group_by(STATE, EVTYPE) %>% summarise_each(funs(sum))aggregate(.~STATE+EVTYPE, df, sum)
  • setDT(df)[, lapply(.SD, sum), .(STATE, EVTYPE)]data.table
  • @docendodiscimus,我一开始也是这么想的,但我认为这里的不同之处在于 OP 想按组总结他的 all 列,而我不能'找不到一个好的骗子。
  • @DavidArenburg,我看看能不能找到一个。在此期间随意回答(我可能找不到任何答案)
  • 几个相关的问题是:data.tablebasedplyr。我会看看我还能找到什么。 one more

标签: r aggregate


【解决方案1】:

你可以试试

library(dplyr)
df %>% 
    group_by(STATE, EVTYPE) %>% 
    summarise_each(list(sum))

或者

aggregate(.~STATE+EVTYPE, df, sum)

【讨论】:

  • 这解决了我的问题 - 谢谢! funs 现在已弃用。你可以使用list(sum)
  • @Bill Inn 新版本是summarise(across(everything(), sum), .groups = 'drop')
  • 如果我有任何非数字列,这对我不起作用。
  • @Bill 你可以使用summarise(across(where(is.numeric), sum), .groups = 'drop')
【解决方案2】:

试试 ddply,例如下面的示例对显式类型的列求和,但我几乎可以肯定可以使用通配符或技巧来对所有列求和。分组按“STATE”进行。

library(plyr)
df <- read.table(text = "STATE  EVTYPE FATALITIES INJURIES
1     AL TORNADO          0       15
3     AL TORNADO          0        2
4     AL TORNADO          0        2
5     AL TORNADO          0        2
6     AL TORNADO          0        6
7     AL TORNADO          0        1
9     AL TORNADO          1       14
11    AL TORNADO          0        3
12    AL TORNADO          0        3
13    AL TORNADO          1       26
14    IL FLOOD            0       15
15    IL FLOOD            0       20
16    IL FIRE             1        1", header = TRUE, sep = "")

c = ddply(df,.(STATE),summarise,val1 = sum(FATALITIES), val = sum(INJURIES))
print(c)

结果:

  STATE val1 val
1    AL    2  74
2    IL    1  36

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多