我有一个如下所示的数据集:
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()的输出变成表(结果数据集)。
答案 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