我有一个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
Run Code Online (Sandbox Code Playgroud)
我想计算一个汇总列(比如说: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
Run Code Online (Sandbox Code Playgroud)
我想通过索引来指示列的范围,因为我有一堆列,名称很麻烦.以下代码有效,但我宁愿使用矢量化方法来提高性能.
> 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
Run Code Online (Sandbox Code Playgroud)
没有使用for循环来逐步执行data.frame行的任何方法吗?
您可以使用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)
Run Code Online (Sandbox Code Playgroud)