2015-10-09 49 views
0

如何獲取3個不同數據框的方法?我試過了:獲取不同數據框中匹配列的方法

df1<-data.frame(c(1,2,3),c(1,7,3),c(rep(1,3))) 
colnames(df1)<-c("c1","c2","c3") 
df2<-data.frame(c(5,5,5),c(1,3,4),c(rep(1,3))) 
colnames(df2)<-c("c1","c2","c3") 
df3<-data.frame(c(2,5,2),c(1,1,1),c(rep(1,3))) 
colnames(df3)<-c("c1","c2","c3") 
#m3<-m3[!(is.na(m3[,3])|is.na(m3[,4])),] 
#m3[!duplicated(m3$c1),] 

cbind(apply(data.frame(df1,df2,df3), 1, mean)) 

哪給了我一行中所有東西的手段。我的目標是獲得匹配行的平均值,例如每列的平均值(df1 [,1]和df2 [,1]和df [,3])。

什麼我希望的是:

 c1.mean c2.mean c3.mean 
row1 2.67   1  1 
row2  4   3.67  1 
row3 3.33  2.67 1 

回答

2
setNames(round((df1+df2+df3)/3,digit=2),paste0('c',1:3,'.mean')) 
0

如果有更多的數據集,我們可以通過數據集的n個放置在一個list+Reduce和鴻溝。

setNames(round(Reduce('+', mget(ls(pattern='df\\d+')))/3,2), 
          paste0(names(df1), '.mean')) 
# c1.mean c2.mean c3.mean 
#1 2.67 1.00  1 
#2 4.00 3.67  1 
#3 3.33 2.67  1 

當數據集中有NAs時,上述方法可能不是最好的。如果有NA值,我們可以在list轉換爲array和使用applyrowMeansna.rm=TRUE

res <- round(apply(array(unlist(mget(ls(pattern='df\\d+'))), 
       dim=c(dim(df1), 3)), 2, rowMeans, na.rm=TRUE),2) 
res 
#  [,1] [,2] [,3] 
#[1,] 2.67 1.00 1 
#[2,] 4.00 3.67 1 
#[3,] 3.33 2.67 1 

colnames(res) <- paste0(names(df1), '.mean') 
相關問題