我有一个三列的数据框,如下所示:
> head(d)
YYYYMM State Weight
1 200812 AL 1876.356
2 200812 AL 2630.503
3 200812 AL 2763.981
4 200812 AL 2693.110
5 200812 AL 2905.784
6 200812 AL 3511.313
它有51个州,从2008-04到2010-04,因此它有25个独特的YYYYMM元素:
> levels(factor(d$YYYYMM))
[1] "200804" "200805" "200806" "200807" "200808" "200809" "200810"
[8] "200811" "200812" "200901" "200902" "200903" "200904" "200905"
[15] "200906" "200907" "200908" "200909" "200910" "200911" "200912"
[22] "201001" "201002" "201003" "201004"
使用table(d$YYYYMM,d$State)
我得到一个计数列表:
head(table(d$YYYYMM,d$State))
ME NH VT MA RI CT NY NJ PA OH IN IL ...
200804 2018 2340 1501 1651 1781 2373 4550 2181 3328 2949 1631 3242 ...
200805 2002 2332 1556 1648 1770 2360 4521 2217 3294 2936 1671 3193 ...
200806 1999 2369 1552 1676 1803 2390 4578 2221 3331 2997 1642 3181 ...
200807 1988 2354 1605 1601 1769 2362 4530 2165 3318 2973 1592 3271 ...
200808 1998 2348 1649 1667 1812 2411 4417 2191 3302 2975 1627 3198 ...
200809 2032 2343 1679 1670 1865 2367 4599 2185 3320 2914 1625 3155 ...
...
但是,我希望这些数字不是计数,而是权重的总和。换句话说,例如,对于200804和州ME我不想要计数,而是权重之和:
> sum(d[d$YYYYMM==200804 & d$State=="ME",]$Weight)
[1] 1063323
我尝试使用" for"循环计算,但它花了太多时间。有没有办法修改table()
函数来实现它?如果没有,还有其他选择吗?最终,我想计算百分比,但是一旦我知道如何通过YYYYMM和州获得权重总和,这是微不足道的。谢谢。如果需要,下面是数据摘要。如果需要进一步澄清,请告诉我。
> summary(d)
YYYYMM State Weight
Min. :200804 CA : 221244 Min. : 0
1st Qu.:200810 TX : 132650 1st Qu.: 1176
Median :200904 NY : 114282 Median : 2496
Mean :200887 FL : 106116 Mean : 2226
3rd Qu.:200910 PA : 82482 3rd Qu.: 3139
Max. :201004 IL : 80816 Max. :16822
(Other):1906523
答案 0 :(得分:2)
我认为tapply是您正在寻找的功能:
tapply(d$weight, list(d$State, d$YYYYMM), sum)
答案 1 :(得分:1)
首先,将您的数据帧重新整理为宽格式:
require(reshape2)
df <- dcast(d, YYYYMM ~ State, value.var="Weight")
之后,您可以按月将值除以:
aggregate(df[,-1], df$YYYYMM, FUN = sum)