首页 文章

通过r中的组变量汇总

提问于
浏览
0

我有一个数据框如下:

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))

但我得到一个错误说'错误:无法修改分组变量' .

'pipe statement'中的前两个语句似乎工作正常但只是根据第一个块给出输出,所以错误似乎来自'summary'语句 .

任何解决这个问题的建议都将受到赞赏 .

2 回答

  • 1

    在使用 sum 'total'更新'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”的'total'为12

  • 0

    这是一个基本的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 将列变量放在结果数据集的前面,因此列与所需的输出略有混乱 . 修复列是传递原始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
    

相关问题