【问题标题】:Getting sums by multiple columns of factors of a data frame in R通过R中数据框的多列因子获取总和
【发布时间】: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           

【问题讨论】:

标签: r dataframe summary


【解决方案1】:

我认为 tapply 是您正在寻找的功能:

tapply(d$weight, list(d$State, d$YYYYMM), sum)

【讨论】:

    【解决方案2】:

    首先,将您的数据框重塑为宽格式:

    require(reshape2)
    df <- dcast(d, YYYYMM ~ State, value.var="Weight")
    

    之后,您可以按月对值求和:

    aggregate(df[,-1], df$YYYYMM, FUN = sum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多