有没有办法可以改进,或更简单地完成?
means.by<-function(data,INDEX){
b<-by(data,INDEX,function(d)apply(d,2,mean))
return(structure(
t(matrix(unlist(b),nrow=length(b[[1]]))),
dimnames=list(names(b),col.names=names(b[[1]]))
))
}
Run Code Online (Sandbox Code Playgroud)
这个想法与SAS MEANS BY语句相同.函数'means.by'获取data.frame和索引变量,并计算对应于INDEX唯一值的每组行的data.frame列的平均值,并返回带有该行的新数据框命名INDEX的唯一值.
我确信在R中必须有更好的方法来做到这一点,但我想不出任何事情.
我一直试图聚合(一些不稳定的)每日数据.我实际上正在使用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")
Run Code Online (Sandbox Code Playgroud)
现在我想每天聚合这个(注意有时候一天有> 1个数据点,有时候也没有.
我已经尝试了很多很多变化,但我似乎无法聚合,所以例如这失败了:
aggregate(z, as.Date(time(z)), sum)
# Error in Summary.factor(2:3, na.rm = FALSE) : sum not meaningful for factors
Run Code Online (Sandbox Code Playgroud)
关于聚合似乎有很多内容,我尝试了很多版本,但似乎无法在日常水平上总结这一点.除了每日总结之外,我还想运行cummax和累积平均值.
任何帮助都会受到高度赞赏.
更新
我实际使用的代码如下:
z <- read.zoo(file = "data.csv", sep = ",", header = TRUE, stringsAsFactors = FALSE, blank.lines.skip = T, na.strings="NA", format = "%Y%m%d");
Run Code Online (Sandbox Code Playgroud)
似乎我(无意)引用上面的数字类似于实践中发生的事情,因为当我这样做时: …