2013-05-13 33 views

回答

9

如果df與列的data.frame,A,B,C

sum(df$A==1 & df$B==1) 
+4

如果你的列只包含0或1,你也可以說'總和(DF $ A&DF $ B)',它把' df $ A'和'df $ B'作爲布爾向量與'&'進行AND操作。 – 2013-05-13 18:26:05

4

這確實的伎倆,先創建一些數據:

df = data.frame(round(matrix(runif(3*10), 10, 3))) 
names(df) = c("A","B","C") 

,並尋求解決方案:

sum(rowSums(df[c("A","B")]) == 2) 

或者:

sum(apply(df[c("A","B")] == 1, 1, all)) 

編輯(泰勒林克):

我很好奇考慮速度的三種方法,我想通保羅的第一種方法是最快的,但錯了。使用微基準測試包(500次迭代)在一個10,000行的數據集:

## Unit: microseconds 
##  expr  min  lq  median  uq   max neval 
## LOGICAL() 386.725 397.455 412.1495 434.308  710.940 500 
## APPLY() 31225.830 39327.696 42790.0280 46586.137 1169824.066 500 
## ROWSUMS() 460.432 489.588 590.5840 621.373 7884.713 500 
+1

隨時刪除我的編輯,但我很好奇,並認爲信息是有價值的,但沒有我自己的答案 – 2013-05-13 18:55:41

+1

@TylerRinker感謝您的編輯!我並不感到驚訝'apply'使用R循環的速度相當慢,而'rowSums'使用(可能)C代碼。 – 2013-05-13 19:14:14