【问题标题】:Collapse a matrix to sum values in one column by values in another折叠矩阵以将一列中的值与另一列中的值相加
【发布时间】:2012-08-01 23:51:56
【问题描述】:

我有一个包含三列的矩阵:县、日期和就诊次数。每个县的日期重复,如下所示(仅作为示例):

  County A  1/1/2012  2
  County A  1/2/2012  0
  County A  1/3/2012  5
  ... etc.
  County B  1/1/2012  3
  County B  1/2/2012  4
  ... etc.

我想折叠此矩阵以汇总每个日期所有县的访问量。所以它看起来像这样:

1/1/2012  5
1/2/2012  4
etc.

我正在尝试在 R 中使用 "table()" 函数,但似乎无法让它以这种方式按日期对访问进行操作。当我做"table(dt$date, dt$Visits)" 时,它给了我一个这样的频率表:

             0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  2011-01-01 3 1 2 0 1 1 0 2 0 0  0  0  0  0  0  0
  2011-01-02 2 3 1 0 0 1 0 0 1 0  2  0  0  0  0  0
  2011-01-03 3 1 1 2 1 0 0 0 0 1  0  0  0  0  1  0

有什么建议吗?有没有更好的函数可以使用,也许是某种“总和”?

谢谢!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    table() 不是用于求和,而是用于记录计数。如果你想使用tapply,你会得到一个表格输出并且可以应用sum 函数。或者您可以使用ave 来获得与数据帧等长的总和向量。也许:

      with( EDcounts, tapply(EDcounts[[3]], EDcounts[[2]], sum, na.rm=TRUE) )
    

    如果您将“访问”列名称放在公式的 LHS 上,您也可以将 xtabs 哄骗到访问次数的总和中。

    【讨论】:

    • 谢谢! Taply 工作得很好。以前从未见过“with”——太酷了!
    • with 将大大简化您的控制台工作。它的帮助页面警告说,它可能会导致函数内部出现错误,就像使用“$”作为函数一样。
    【解决方案2】:

    正如@DWin 所说,table() 不是用于求和,而是用于记录计数。

    我给出了三个方法示例,分别使用plyrdata.tableaggregate

    all_data <- expand.grid(country = paste('Country', LETTERS[1:3]), 
      date = seq(as.Date('2012/01/01'), as.Date('2012/12/31'), by = 1) )
    
    all_data[['ed_visits']] <- rpois(nrow(all_data), lambda = 5)
    
    
    
    # using plyr
    
    library(plyr)
    
    by_date_plyr <- ddply(all_data, .(date), summarize, visits = sum(ed_visits))
    
    
    # using data.table
    library(data.table)
    all_DT <- data.table(all_data)
    by_date_dt <- all_DT[, list(visits = sum(ed_visits)), by = 'date' ]
    
    # using aggregate
    by_date_base <- aggregate(ed_visits ~ date, data = all_data, sum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2017-04-14
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多