通过R中数据帧的多列因子获得总和

时间:2014-04-08 07:53:39

标签: r dataframe summary

我有一个三列的数据框,如下所示:

> 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           

2 个答案:

答案 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)