通过r中的组变量汇总

时间:2016-12-17 10:44:35

标签: r dplyr

我的数据框如下:

 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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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