R:一次聚合多列
R: aggregate several colums at once
我是 R 的新手,这是我第一次使用 Whosebug,所以如果我问的问题很明显或者我的问题不够清楚,请原谅。
我正在处理以下数据集
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
我错过了什么?我做错了什么?
谢谢。
这可能是某些列中存在缺失值并且根据 aggregate
中的默认选项 na.action= na.omit
删除整行的情况。我会尝试 na.action=NULL
aggregate(cbind(PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)~EVTYPE,
FUN=sum, na.rm=TRUE, data=storm, na.action=NULL)
或者我们可以在按“EVTYPE”分组后使用 dplyr
中的 summarise_each
library(dplyr)
storm %>%
group_by(EVTYPE) %>%
summarise_each(funs(sum=sum(., na.rm=TRUE)),
PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)
我是 R 的新手,这是我第一次使用 Whosebug,所以如果我问的问题很明显或者我的问题不够清楚,请原谅。
我正在处理以下数据集
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
我错过了什么?我做错了什么?
谢谢。
这可能是某些列中存在缺失值并且根据 aggregate
中的默认选项 na.action= na.omit
删除整行的情况。我会尝试 na.action=NULL
aggregate(cbind(PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)~EVTYPE,
FUN=sum, na.rm=TRUE, data=storm, na.action=NULL)
或者我们可以在按“EVTYPE”分组后使用 dplyr
中的 summarise_each
library(dplyr)
storm %>%
group_by(EVTYPE) %>%
summarise_each(funs(sum=sum(., na.rm=TRUE)),
PROPTOTAL,CROPTOTAL,FATALITIES,INJURIES)