2012-12-06 76 views
1

我想平均数据集中的列对,而不是移动平均值。我想将列分成两组,并找出每对的平均值。R中的平均列对

我提供了一个样本数据集,所需的结果和嵌套的for循环,它们返回所需的结果。我只是认为可能有更好的方法。很抱歉,如果我在其他帖子中忽略了解决方案。我在这里搜索过,但我并没有像往常一样努力地搜索互联网。感谢您的任何建议。

x = read.table(text = " 
    site  yr1 yr2 yr3 yr4 
    1  2 4 6 8 
    2  10 20 30 40 
    3  5 NA 2 3 
    4  100 100 NA NA", 
sep = "", header = TRUE) 

x 

desired.outcome = read.table(text = " 
    site ave12 ave34 
    1  3  7 
    2  15  35 
    3  5 2.5 
    4  100  NA", 
sep = "", header = TRUE) 

result <- matrix(NA, ncol=((ncol(x)/2)+1), nrow=nrow(x)) 

for(i in 1: ((ncol(x)-1)/2)) { 
    for(j in 1:nrow(x)) { 

    result[j, 1 ] <- x[j,1] 
    result[j,(i+1)] <- mean(c(x[j,(1 + ((i-1)*2 + 1))], x[j,(1 + ((i-1)*2 + 2))]), na.rm = TRUE) 

    } 
} 

回答

4
output <- sapply(seq(2,ncol(x),2), function(i) { 
    rowMeans(x[,c(i, i+1)], na.rm=T) 
}) 

然后你就可以在第一列添加到output矩阵。

output <- cbind(x[,1], output) 

或者,你可以使用within

within(x, { 
    pair.colmeans <- sapply(seq(2, ncol(x), 2), function(i) { 
     rowMeans(x[, c(i, i+1)], na.rm=TRUE) 
    }) 
}) 
+0

我希望你不介意的编辑。添加'内部'以显示如何直接修改'data.frame'。 – A5C1D2H2I1M1N2O1R2T1

+0

好的贡献,谢谢余下关于'内部'的功能!我通常不会使用这些函数,因为读取代码变得更加困难。 – DrDom