我的数据框如下:
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'声明。
任何解决此问题的建议都将受到赞赏。
答案 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