1

我有一个如下所示的数据集:

Type    Date    Lively  Count
sm      1/13/2010   10  10
sm      1/14/2010   10  20
sm      2/15/2010   20  30
am      4/16/2010   5   42
am      1/17/2010   10  34
am      3/18/2010   40  54
sm      1/19/2010   10  65
sm      4/20/2010   5   67
sm      3/21/2010   40  76

我正在尝试按月平均所有数字参数。所以我的结果数据集理想情况下是:

Date     Lively Count
Jan 2010     10     32.25
Feb 2010     20     30.00
Mar 2010     40     65.00
Apr 2010      5     54.50

我非常接近这一点,我目前拥有的是:

         Lively Count
Jan 2010     10     32.25
Feb 2010     20     30.00
Mar 2010     40     65.00
Apr 2010      5     54.50

如您所见,我缺少标题“日期”。这是我的代码:

library(zoo)
z <- zoo(data[3:4], as.Date(data[,2], "%m/%d/%Y"))
aggregate(z, as.yearmon, mean)

我不知道如何为左列('Date')制作标题,更重要的是,我不知道如何将 aggregate() 的输出制作成表格(结果数据集)。

4

1 回答 1

4

您可以使用该list格式在aggregate.

要获取“日期”值,您需要参考动物园对象的“索引”

aggregate(list(Lively = z[, "Lively"], Count = z[, "Count"]), 
          list(Date = as.yearmon(index(z))), mean)
#       Date Lively Count
# 1 Jan 2010     10 32.25
# 2 Feb 2010     20 30.00
# 3 Mar 2010     40 65.00
# 4 Apr 2010      5 54.50

或者,如果需要,您可以轻松更改您的姓名。这将使您能够使用更好的公式方法aggregate

x <- aggregate(. ~ as.yearmon(index(z)), z, mean)
names(x)[1] <- "Date"
x
#       Date Lively Count
# 1 Jan 2010     10 32.25
# 2 Feb 2010     20 30.00
# 3 Mar 2010     40 65.00
# 4 Apr 2010      5 54.50

但是请注意,这样做,您会错过这样做所zoo带来的所有好处。您实际上已经获取了 a data.frame,将其转换为zoo对象,然后将其重新转换为data.frame.

您的aggregate(z, as.yearmon, mean)解决方案将是我将采取的方式,并使用index().


更新

如果您只是出于美学原因在稍后阶段执行此操作,您可以继续使用zoo对象,因为它会给您提供很多使用基本 R 函数可能无法获得的灵活性,然后cbind在最后使用。

从你离开的地方开始:

library(zoo)
z <- zoo(data[3:4], as.Date(data[,2], "%m/%d/%Y"))
x <- aggregate(z, as.yearmon, mean)
cbind(Date = index(x), 
      as.data.frame.matrix(x, row.names = NULL))
#       Date Lively Count
# 1 Jan 2010     10 32.25
# 5 Feb 2010     20 30.00
# 6 Mar 2010     40 65.00
# 8 Apr 2010      5 54.50
于 2013-08-12T08:51:46.433 回答