【发布时间】:2014-04-08 07:53:39
【问题描述】:
我有一个三列的数据框,如下所示:
> 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 年 4 月到 2010 年 4 月,所以它有 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
【问题讨论】:
-
这可能是一篇有用的 Stackoverflow 帖子,可以作为起点:stackoverflow.com/questions/8212699/…