2017-03-18 47 views
2

我是一个偶然的R-用户与几家大型数据集的年度工作与今年一列,另一个用于位置处理多余的行,类似于以下(我称之为“时间序列”):在colMeans计算

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

您使用colMeans,因为它可以更容易地创建一个分组变量,然后使用聚合 – user20650

回答

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 

DATA

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 
+0

谢谢,做我需要的东西。 – Bek

+0

一个(可能是愚蠢的)question--可同样的事情,如果我想要额外的行(S)为自己的小组使用? – Bek

+0

我不能确定我明白你的问题。以上只是分配一个值每n行,如果有多余的行它asaigns它们相同的值作为最后 – Sotos

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)]) 
+0

谢谢,我实际上将需要这一个,也当我想计算最后一组的意图分开。 – Bek