2016-12-17 103 views
0

一组变量I有一个数据帧,如下所示:汇总由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)) 

,但我得到了一个n错误说'错误:不能修改分组变量'。

'管道声明'中的前两个语句似乎工作正常,但只是根据第一个块提供输出,所以错误似乎来自'summarize'语句。

任何建议来解决这个将不胜感激。

+1

你如何选择其他列? – Sotos

回答

1

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

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”“冰雹”是基于例如

+1

谢谢,这工作。你能说你可以把'总'值降序吗?我使用我拥有的数据框来运行您的语句,并从最低值开始并运行到最高值,在982行之后。我把desc放在'total'附近,但没有工作。另外,你知道dplyr的一个很好的教程吗?我想我很困惑它有多灵活。再次感谢。 – David

+0

@David感谢您的评论。只需添加'%>%排列(desc(total))'(在帖子中更新)。你可以检查dplyr [vignette](https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html)。另外,勾选[here](http://stackoverflow.com/help/someone-answers) – akrun

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