`tapply()`返回数据帧

时间:2011-09-09 02:22:46

标签: r apply

我有一个带有日期时间(POSIXct),“节点”(因子)和“c”(数字)列的数据集,例如:

                 date node           c
1 2011-08-14 10:30:00    2 0.051236000
2 2011-08-14 10:30:00    2 0.081230000
3 2011-08-14 10:31:00    1 0.000000000
4 2011-08-14 10:31:00    4 0.001356337
5 2011-08-14 10:31:00    3 0.001356337
6 2011-08-14 10:32:00    2 0.000000000

我需要对所有“日期”和“节点”对取“c”列的平均值,所以我这样做了:

tapply(data$c, list(data$node, data$date), mean)

我获得的结果是我想要的,但是在一个奇怪的结构中:

num [1:5, 1:8923] 0 0 0.00092 0.00146 NA ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:5] "1" "2" "3" "4" ...
  ..$ : chr [1:8923] "2011-08-14 10:30:00" "2011-08-14 10:31:00" "2011-08-14 10:32:00" "2011-08-14 10:33:00" ...

示例输出为:

  2011-08-17 23:56:00 2011-08-17 23:57:00 2011-08-17 23:58:00
1        4.759077e-05        4.759077e-05        4.759077e-05
2        0.000000e+00        3.875248e-05        1.595690e-04
3        1.134391e-03        1.134391e-03        1.109730e-03
4        4.882813e-04        6.914658e-04        4.955846e-04
5        0.000000e+00        0.000000e+00        0.000000e+00

我想要的是原始结构,具有日期时间,节点因子和“c”值。我无法弄清楚如何实现这一目标。任何帮助将不胜感激。

非常感谢。

3 个答案:

答案 0 :(得分:7)

你可以试试......

aggregate( c ~ node + date, data = data, FUN = mean )

答案 1 :(得分:4)

而不是tapply你想使用ave

data$grp.mean <- ave(data$c, list(data$node, data$date), FUN= mean)

再看一遍,我想知道你是否希望在24小时的日历意义上根据“日期”完成聚合?

如果您想使用已有的结果(假设它们被命名为“M”),您可能想尝试:

require(reshape2)
newdf <- melt(t(M))

答案 2 :(得分:4)

如果您希望输出是具有三列的数据框,您可能会从查看plyr包中获益(假设您的数据存储在dat中):

library(plyr)
ddply(dat,.(date,node),summarise,m = mean(c))