如何从R中的aggregate()函数创建表

时间:2013-08-12 07:58:08

标签: r

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

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()的输出变成表(结果数据集)。

1 个答案:

答案 0 :(得分: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通过这样做提供的所有善意。您基本上已使用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