2010-12-21 50 views
4

我有幾個數據幀,abcd,每個都有相同的列名。我想找到這些數據幀的平均值和中值。換句話說,構建具有相同的尺寸新meanmedian數據幀爲ab在r中查找手段和數據幀的中間值

我可以用一對夫婦for循環,但我敢打賭,有這樣使用R華而不實的方式內置的功能會更快。

回答

9

繼喬希Ulrich的答案,怎麼樣

library(abind) 
apply(abind(a,b,c,d,along=3),c(1,2),median) 

? (在適當的切片使用rowMeans仍將快於apply荷蘭國際集團mean ...我認爲這是在Biobase(Bioconductor的)包rowMedians如果你真的需要速度?)

1

你可以串數據幀到數據幀的列表,然後使用lapply(myList, mean, ...)

+0

如果你的意思`lapply(C( a,b),意思是)`,那就不對了。這給了我每個列的平均值,而不是數據幀。 – tkerwin 2010-12-21 19:03:59

+0

ohhhhh ...我沒有意識到你想要他們所有的組合。 – 2010-12-21 19:16:35

2

我不知道JD的答案給你你想要什麼,因爲得到的對象不會是相同的尺寸, a,b

把你的data.frames放入列表是一個好的開始。然後,您可以將每個列分組到一個新列表中,cbind列表成一個矩陣,並在其行上使用apply

a <- data.frame(rnorm(10), runif(10)) 
b <- data.frame(rnorm(10), runif(10)) 
c <- data.frame(rnorm(10), runif(10)) 
d <- data.frame(rnorm(10), runif(10)) 
myList <- list(a,b,c,d) 
sapply(1:ncol(a), function(j) { # median 
    apply(do.call(cbind,lapply(myList,`[`,,j)), 1, median) 
}) 
sapply(1:ncol(a), function(j) { # mean 
    apply(do.call(cbind,lapply(myList,`[`,,j)), 1, mean) 
}) 
sapply(1:ncol(a), function(j) { # faster mean 
    rowMeans(do.call(cbind,lapply(myList,`[`,,j))) 
})