R:一次聚合几个列

时间:2015-08-20 10:50:40

标签: r aggregate many-to-one cbind

我是R的新手,这是我第一次使用stackoverflow,请原谅我,如果我要求明显的东西,或者我的问题不够明确。

我正在使用以下数据集

dim(storm)
[1] 883602     39


    names(storm)
   [1] "STATE__"    "BGN_DATE"   "BGN_TIME"   "TIME_ZONE"  "COUNTY"
   [6] "COUNTYNAME" "STATE"      "EVTYPE"     "BGN_RANGE"  "BGN_AZI"
   [11] "BGN_LOCATI" "END_DATE"   "END_TIME"   "COUNTY_END" "COUNTYENDN"
   [16] "END_RANGE"  "END_AZI"    "END_LOCATI" "LENGTH"     "WIDTH"
   [21] "F"          "MAG"        "FATALITIES" "INJURIES"   "PROPDMG"
   [26] "PROPDMGEXP" "CROPDMG"    "CROPDMGEXP" "WFO"        "STATEOFFIC"
   [31] "ZONENAMES"  "LATITUDE"   "LONGITUDE"  "LATITUDE_E" "LONGITUDE_"
   [36] "REMARKS"    "REFNUM"     "PROPTOTAL"  "CROPTOTAL"

我有兴趣使用EVTYPE(因子变量)来聚合4个其他数值变量(PROPTOTAL, CROPTOTAL, FATALITIES, INJURIES

因子变量为950级:

length(unique(storm$EVTYPE))
[1] 950


class(storm$EVTYPE)
[1] "factor"

因此,当我运行以下命令时,我希望聚合数据框有950个观察值和5个变量:

    storm_tidy<-
aggregate(cbind(PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)~EVTYPE,FUN=sum,data=storm)

但是我只获得155

dim(storm_tidy)
[1] 155   5

我在函数的帮助页面后面使用了几列的聚合(使用cbind):

公式,一个〜一个,一个多个,多个〜一个,多个〜多个:
aggregate(weight ~ feed, data = chickwts, mean) aggregate(breaks ~ wool + tension, data = warpbreaks, mean) **aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean)** aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum)

我在某些时候失去了信息:

sum(storm$PROPTOTAL)
[1] 424769204805

sum(storm_tidy$PROPTOTAL)
[1] 228366211339

但是,如果我逐列聚合,它似乎工作正常:

storm_tidy <- aggregate(PROPTOTAL~EVTYPE,FUN = sum, data = storm)
dim(storm_tidy)
[1] 950   2





sum(storm_tidy$PROPTOTAL)
[1] 424769204805

我错过了什么?我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:0)

这可能是某些列中缺少值并且基于na.action= na.omit中的默认选项aggregate删除整行的情况。我会试试na.action=NULL

aggregate(cbind(PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)~EVTYPE,
            FUN=sum, na.rm=TRUE, data=storm, na.action=NULL)

或者我们可以在使用&#39; EVTYPE`

进行分组后使用summarise_each中的dplyr
library(dplyr)
storm %>% 
   group_by(EVTYPE) %>% 
   summarise_each(funs(sum=sum(., na.rm=TRUE)), 
                 PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)