【问题标题】:Summarising by a group variable in r通过 r 中的组变量进行汇总
【发布时间】:2016-12-17 10:44:34
【问题描述】:

我有一个数据框如下:

 head(newStormObject)
     FATALITIES   INJURIES    PROPVALDMG CROPVALDMG      EVTYPE     total
 1           0          15    2.5e+05          0        TORNADO        15
 2           0           0    2.5e+04          0        TORNADO         0
 3           0           3    2.5e+07          0        TORNADO         3 
 4           0           3    2.5e+07          0        TORNADO         3
 5           0           0    0.0e+00          0      TSTM WIND         1
 6           0           0    0.0e+00          0           HAIL         2
 7           0           0    0.0e+00          0           HAIL         3
 8           0           0    0.0e+00          0      TSTM WIND         0
 9           0           0    0.0e+00          0           HAIL         0
10           0           0    0.0e+00          0      TSTM WIND         0
11           0           0    0.0e+00          0      TSTM WIND         0
12           0           0    0.0e+00          0           HAIL         1
13           0           0    0.0e+00          0           HAIL         1
14           0           0    0.0e+00          0           HAIL         5
15           0           0    0.0e+00          0      TSTM WIND         0

我正在尝试按事件类型 (EVTYPE) 分组并相应地汇总总计列,因此打印数据框如下所示:

       FATALITIES   INJURIES  PROPVALDMG CROPVALDMG      EVTYPE     total
 1           0          15    2.5e+05          0        TORNADO       21
 2           0           0    0.0e+00          0           HAIL       11
 3           0           0    0.0e+00          0      TSTM WIND        0

为了尝试做到这一点,我写了以下内容

newStormObject %>% group_by(EVTYPE, total) %>% summarise(EVTYPE, sum(total))

但我收到一条错误消息“错误:无法修改分组变量”。

“管道语句”中的前两个语句似乎工作正常,但只是根据第一个块给出输出,因此错误似乎来自“总结”语句。

任何解决此问题的建议将不胜感激。

【问题讨论】:

  • 你如何选择其他列?

标签: r dplyr


【解决方案1】:

在用“total”的sum 更新“total”之后,我们可以使用slice 为所有其他列取第一个值。

library(dplyr)
df1 %>% 
   group_by(EVTYPE) %>% 
   mutate(total = sum(total)) %>%
   slice(1L) %>%
   arrange(desc(total))
#      FATALITIES INJURIES PROPVALDMG CROPVALDMG    EVTYPE total
#       <int>    <int>      <dbl>      <int>     <chr> <int>
#1          0       15     250000          0   TORNADO    21
#2          0        0          0          0      HAIL    12
#3          0        0          0          0 TSTM WIND     1

注意:根据示例,“EVTYPE”“HAIL”的“总数”为 12

【讨论】:

  • 谢谢,成功了。你能说你可以把“总”值按降序排列吗?我用我拥有的数据框运行了您的语句,它从最低值开始,然后运行到最高值,982 行。我把 desc 放在“total”附近,但没有用。另外,你知道关于 dplyr 的好教程吗?我想我对它的灵活性感到困惑。再次感谢。
【解决方案2】:

这是一个返回相同值(顺序略有不同)的基本 R 解决方案

merge(df[!duplicated(df$EVTYPE), -length(df)],
         aggregate(total ~ EVTYPE, data=df, sum), by="EVTYPE")
     EVTYPE FATALITIES INJURIES PROPVALDMG CROPVALDMG total
1      HAIL          0        0          0          0    12
2   TORNADO          0       15     250000          0    21
3 TSTM_WIND          0        0          0          0     1

duplicated用于选择每个EVTYPE级别的第一个观察值,aggregate用于计算总变量的总和。这些结果在 EVTYPE 上合并。

行按factor 自动存储因子变量的顺序排列,即字母顺序。由于merge 将 by 变量放在结果数据集的前面,这些列与所需的输出略有不同。修复列是传递原始 data.frame 名称的问题。

merge(df[!duplicated(df$EVTYPE), -length(df)],
      aggregate(total ~ EVTYPE, data=df, sum), by="EVTYPE")[, names(df)]
  FATALITIES INJURIES PROPVALDMG CROPVALDMG    EVTYPE total
1          0        0          0          0      HAIL    12
2          0       15     250000          0   TORNADO    21
3          0        0          0          0 TSTM_WIND     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2019-08-18
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多