汇总每日内容

时间:2010-09-01 17:21:22

标签: r aggregate

我一直试图聚合(一些不稳定的)每日数据。我实际上正在使用csv数据,但如果我重新创建它 - 它看起来像这样:

library(zoo)

dates <- c("20100505", "20100505", "20100506", "20100507")
val1 <- c("10", "11", "1", "6")
val2 <- c("5", "31", "2", "7")

x <- data.frame(dates = dates, val1=val1, val2=val2)
z <- read.zoo(x, format = "%Y%m%d")

现在我想每天汇总一下(注意有时候一天有> 1个数据点,有时候也没有。

我尝试了很多很多变化,但我似乎无法聚合,所以例如这会失败:

aggregate(z, as.Date(time(z)), sum)
# Error in Summary.factor(2:3, na.rm = FALSE) : sum not meaningful for factors

关于聚合似乎有很多内容,我尝试了很多版本,但似乎无法在日常水平上总结这一点。除了每日总结之外,我还想运行cummax和累积平均值。

非常感谢任何帮助。

更新

我实际使用的代码如下:

z <- read.zoo(file = "data.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE, blank.lines.skip = T, na.strings="NA", format = "%Y%m%d");

似乎我(无意)引用上述数字与实际情况相似,因为当我这样做时:

aggregate(z, index(z), sum)
#Error in Summary.factor(25L, na.rm = FALSE) : sum not meaningful for factors

有多列(100左右),如何将它们自动指定为as.numeric? (stringAsFactors = False似乎不起作用?)

4 个答案:

答案 0 :(得分:5)

或者你在使用zoo之前聚合(虽然val1和val2需要是数字)。

x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2))
y <- aggregate(x[,2:3],by=list(x[,1]),FUN=sum)

然后将y送入动物园。

您可以避免警告:)

答案 1 :(得分:4)

你开始走正确的道路,但犯了几个错误。

首先,zoo只使用矩阵,而不是data.frames。其次,那些需要数字输入:

> z <- zoo(as.matrix(data.frame(val1=c(10,11,1,6), val2=c(5,31,2,7))), 
+          order.by=as.Date(c("20100505","20100505","20100506","20100507"),
+                           "%Y%m%d"))
Warning message:
In zoo(as.matrix(data.frame(val1 = c(10, 11, 1, 6), val2 = c(5,  :
  some methods for "zoo" objects do not work if the index entries in 
  'order.by' are not unique

这给我们一个警告,这是动物园的标准:它不喜欢相同的时间指数。

显示数据结构总是一个好主意,可能也可以通过str(),也可以在其上运行summary()

> z
           val1 val2
2010-05-05   10    5
2010-05-05   11   31
2010-05-06    1    2
2010-05-07    6    7

然后,一旦我们拥有它,聚合很容易:

> aggregate(z, index(z), sum)
           val1 val2
2010-05-05   21   36
2010-05-06    1    2
2010-05-07    6    7
> 

答案 2 :(得分:1)

val1val2是字符串。 data.frame()将其转化为因素。求和因素没有意义。你可能打算:

x <- data.frame(dates = dates, val1=as.numeric(val1), val2=as.numeric(val2))
z <- read.zoo(x, format = "%Y%m%d")
aggregate(z, as.Date(time(z)), sum)

产生:

           val1 val2
2010-05-05   21   36
2010-05-06    1    2
2010-05-07    6    7

答案 3 :(得分:1)

将字符列转换为数字,然后使用read.zoo使用aggregate参数:

> x[-1] <- lapply(x[-1], function(x) as.numeric(as.character(x)))
> read.zoo(x, format = "%Y%m%d", aggregate = sum)
             val1 val2
2010-05-05   21   36
2010-05-06    1    2
2010-05-07    6    7