我一直试图聚合(一些不稳定的)每日数据。我实际上正在使用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
似乎不起作用?)
答案 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)
val1
和val2
是字符串。 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