2017-03-27 80 views
2

我有一個數據幀的另一列的總和:R:如何計算一列基於在數據幀

Y X1 X2 X3 
1 1 0 1 
1 0 1 1 
0 1 0 1 
0 0 0 1 
1 1 1 0 
0 1 1 0 

我想基於其他列Y列總和所有行時,等於1 ,這是sum(Y=1|Xi =1)。例如,對於列X1s1 = sum(Y=1|Xi =1) =1 + 0 +1+0 =2

Y X1 
1 1 

0 1  

1 1  
0 1 

對於X2列中,s2 = sum(Y=1|Xi =1) = 0 +1+0 =1

Y X2 

    0 1 

    1 1  
    0 1  

對於X3列中,s3 = sum(Y=1|Xi =1) = 1+1 +0+0 =2

Y X3 
    1 1 
    1 1 
    0 1 
    0 1 

我有一個大概的瞭解使用apply(df, 2, sum)爲數據框的列,但我不知道如何子集基於Xi每一列,然後計算出的Y.sum任何幫助表示讚賞!

+0

你沒事嗎這樣做手動每列,或者你想它自動完成一大堆列? – dash2

+0

我希望它altomatically了一大堆 –

+2

列完成據透露,您可能希望下次'dput'您的數據,更容易爲你的應答者可重複性。一些指導:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/28481250#28481250 – Frank

回答

3

您可以使用colSums當Y * X等於1。我想在X2列所需輸出有一個錯誤計數。第2行和第5行對於Y和X2包含1。總和應爲2

x=read.table(text="Y X1 X2 X3 
1 1 0 1 
1 0 1 1 
0 1 0 1 
0 0 0 1 
1 1 1 0 
0 1 1 0",header=TRUE, stringsAsFactors=FALSE) 

colSums(x[,-1]*x[,1]) 

X1 X2 X3 
2 2 2 

您還可以使用crossprod(x[,1],as.matrix(x[,-1]))

 X1 X2 X3 
[1,] 2 2 2 
+0

或'X [,1]%*%as.matrix(X [1,-1])' – Frank

2

有許多方法可以做到這一點。一種是基於你想要的列得到一個子集:

sum(df[df$X1==1,]$Y)

這應該爲你工作。

+0

的'dput'評論屬於一個評論,一個答案不是身體,僅供參考。 – Frank

+1

好吧,我已添加評論。 – Frank

1

另外還有一個辦法,你可以修改總結對應於1,0,或其他一些價值元素。

sapply(x[,-1], function(a) sum(x$Y[a == 1])) 
#X1 X2 X3 
# 2 2 2 
+0

謝謝。您的解決方案在很多情況下更通用。 –

相關問題