在colMeans计算中处理额外的行

时间:2017-03-18 20:13:29

标签: r

偶尔的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)) 

2 个答案:

答案 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)])