2012-12-06 134 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