偶尔的R用户使用几个大型年度数据集,其中一年有一列,另一年有位置,类似于以下(我打电话给"时间序列" ):
Year L1
1960 1.11
1961 1.14
1962 0.75
1963 0.63
1964 1.15
1965 1.08
1966 1.69
1967 0.77
1968 0.69
我试图按4组计算colMeans
,但我的数据集中的行数并不总是可以被4整除。理想情况下,我会在计算中包含任何额外的行对于前一组。
因此,在上面的9行示例中,R将计算1960-1963
(一组4个)1964-1968
(一组5个)的平均值。
这可能吗?
我目前的4人小组代码如下:
fouryrave <- rep(colMeans(matrix(timeseries$L1, nrow=4), na.rm=TRUE))
答案 0 :(得分:3)
最好的办法是创建一个分组变量和聚合,即
n = 4
l1 <- nrow(df) %/% n
df$grp <- c(rep(seq(l1), each = n), rep(tail(seq(l1), 1), nrow(df) - n * l1))
aggregate(L1 ~ grp, df, mean)
# grp L1
#1 1 0.9075
#2 2 1.0760
数据强>
dput(df)
structure(list(Year = 1960:1968, L1 = c(1.11, 1.14, 0.75, 0.63,
1.15, 1.08, 1.69, 0.77, 0.69)), .Names = c("Year", "L1"), row.names = c(NA,
-9L), class = "data.frame")
修改强>
根据你的评论(我有时间杀人),这是一个接受type
参数的函数,它指定了分组的方法,
f1 <- function(df, n, type = 1){
if(type == 1){
l1 <- nrow(df) %/% n
df$grp <- c(rep(seq(l1), each = n), rep(tail(seq(l1), 1), nrow(df) - n * l1))
return(aggregate(L1 ~ grp, df, mean))
} else {
if(type == 2){
l1 <- nrow(df) %/% n
df$grp <- c(rep(seq(l1), each = n), rep(tail(l1, 1)+1, nrow(df) - n * l1))
return(aggregate(L1 ~ grp, df, mean))
}
}
}
f1(df, 4, type = 1)
# grp L1
#1 1 0.9075
#2 2 1.0760
f1(df, 4, type = 2)
# grp L1
#1 1 0.9075
#2 2 1.1725
#3 3 0.6900
答案 1 :(得分:1)
你可以像这样分别计算最后一组的平均值:
fouryrave <- colMeans(matrix(timeseries$L1[1:((length(timeseries$L1) %/% 4
-1)*4)],nrow=4),na.rm=TRUE)
fouryrave[length(fouryrave)+1] <-
mean(timeseries$L1[(((length(timeseries$L1)%/%4-1)*4)+1):length(timeseries$L1)])