3

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

  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.

我正在尝试"table()"在 R 中使用该函数,但似乎无法让它以这种方式按日期对访问进行操作。当我这样做"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

有什么建议么?是否有更好的功能可以使用,也许是某种“总和”?

谢谢!

4

2 回答 2

5

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

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

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

于 2012-08-01T23:58:31.713 回答
3

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

我给出了三个方法示例,plyr使用data.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)
于 2012-08-02T00:11:38.047 回答