2012-07-09 140 views
4

我有一個data.frame,其中有一列是邏輯的列,如何查找data.frame行的子集中的所有元素是否爲TRUE

> tmp <- data.frame(a=c(13, 23, 52), 
+     b=c(TRUE,FALSE,TRUE), 
+     c=c(TRUE,TRUE,FALSE), 
+     d=c(TRUE,TRUE,TRUE)) 
> tmp 
    a  b  c d 
1 13 TRUE TRUE TRUE 
2 23 FALSE TRUE TRUE 
3 52 TRUE FALSE TRUE 

我想計算的摘要列(比如:e)中是邏輯AND的整個範圍內的邏輯列。換句話說,對於給定的行,如果所有的b:d都是TRUE,那麼e將是TRUE;如果任何b:d是FALSE,那麼e將是FALSE

我預期的結果是:

> tmp 
    a  b  c d  e 
1 13 TRUE TRUE TRUE TRUE 
2 23 FALSE TRUE TRUE FALSE 
3 52 TRUE FALSE TRUE FALSE 

我想指出的列由指數的範圍內,因爲我有一堆列,和名稱都很麻煩。下面的代碼工作,但我寧願使用矢量化的方法來提高性能。

> tmp$e <- NA 
> for(i in 1:nrow(tmp)){ 
+  tmp[i,"e"] <- all(tmp[i,2:(ncol(tmp)-1)]==TRUE) 
+ } 
> tmp 
    a  b  c d  e 
1 13 TRUE TRUE TRUE TRUE 
2 23 FALSE TRUE TRUE FALSE 
3 52 TRUE FALSE TRUE FALSE 

任何方式做到這一點不使用for循環來通過data.frame的行?

回答

6

您可以使用rowSums遍歷行......和一些花哨的腳法,使之準自動化:

# identify the logical columns 
boolCols <- sapply(tmp, is.logical) 
# sum each row of the logical columns and 
# compare to the total number of logical columns 
tmp$e <- rowSums(tmp[,boolCols]) == sum(boolCols) 
+0

不錯!計算一筆款項已經發生在我身上,但我沒有想過'rowSums'留在行內。謝謝。 – mac 2012-07-09 22:36:01

1

通過使用ifelse語句rowSums,在一個去,可以來達到的:

tmp$e <- ifelse(rowSums(tmp[,2:4] == T) == 3, T, F) 
相關問題