2012-06-08 59 views
35

的子集:計算一行意味着在給定的樣本數據框架柱

C1<-c(3,2,4,4,5) 
C2<-c(3,7,3,4,5) 
C3<-c(5,4,3,6,3) 
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3) 

DF 
    ID C1 C2 C3 
    1 A 3 3 5 
    2 B 2 7 4 
    3 C 4 3 3 
    4 D 4 4 6 
    5 E 5 5 3 

什麼是創建一個將包含ID列,每一行的平均值的第二數據幀的最佳方式?事情是這樣的:

ID Mean 
A 3.66 
B 4.33 
C 3.33 
D 4.66 
E 4.33 

類似的東西來:

RM<-rowMeans(DF[,2:4]) 

我想保持與他們的ID的對齊方式。

回答

33

計算一行意味着:

創建一個新的data.frame指定第一來自DF的列作爲稱爲ID的列並計算該行上所有其他字段的平均值,並將其放入標題爲「Means」的列中:

data.frame(ID=DF[,1], Means=rowMeans(DF[,-1])) 
    ID Means 
1 A 3.666667 
2 B 4.333333 
3 C 3.333333 
4 D 4.666667 
5 E 4.333333 
21

與您的數據幀DF開始,你可以使用data.table包:上欄的一個子集

library(data.table) 

## EDIT: As suggested by @MichaelChirico, setDT converts a 
## data.frame to a data.table by reference and is preferred 
## if you don't mind losing the data.frame 
setDT(DF) 

# EDIT: To get the column name 'Mean': 

DF[, .(Mean = rowMeans(.SD)), by = ID] 

#  ID  Mean 
# [1,] A 3.666667 
# [2,] B 4.333333 
# [3,] C 3.333333 
# [4,] D 4.666667 
# [5,] E 4.333333 
+1

感謝新行$。另請注意,'class(DF)'''''''data.frame''''''沒有任何函數正在尋找'data.frame'對象應該在'setDT'後面接受'DF'(特別是現在的'data.table'在成熟的一面) – MichaelChirico

+0

如果我想要C2和C3之間的行平均值而只是想怎麼樣? – user3841581

+4

然後你可以使用DF [,。(Mean = rowMeans(.SD)),by = ID,.SDcols = c(「C2」,「C3」)]''。參數'.SDcols'確定你想在'.SD'中包含哪些列。 @ user3841581 – BenBarnes

8

您可以在數據幀創建相應的手段

DF$Mean <- rowMeans(DF[,2:4]) 
相關問題