5

我有一个带有逻辑列块的data.frame,例如

> 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的行的情况下做到这一点?

4

2 回答 2

7

您可以使用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)
于 2012-07-09T22:26:54.027 回答
1

通过在 ifelse 语句中使用 rowSums,可以一次性实现:

tmp$e <- ifelse(rowSums(tmp[,2:4] == T) == 3, T, F)
于 2012-07-10T11:48:34.917 回答