簡體   English   中英

通過r中的組變量進行匯總

[英]Summarising by a group variable in r

我有一個數據框,如下所示:

 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語句”中的前兩個語句似乎工作正常,但僅根據第一個塊給出輸出,因此錯誤似乎來自“ summarise”語句。

解決該問題的任何建議將不勝感激。

在將“ 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

這是一個基本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 ,列與所需的輸出略有混亂, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM