r-在dplyr中,当一组其他逻辑列为true时,对一个逻辑列进行突变



我有一个数据帧,看起来像这样:

typ1  typ2  typ3
T     T     F
F     F     F
T     F     F

我想突变第四个逻辑列,确定其他三个是否为真,所以{T,F,T}。

mutate(isAnyType = any(typ1, typ2, typ3))似乎在使用整列,而我希望使用每行的信息。任何见解都值得赞赏。

我们可以使用reduce|来检查每行中是否有TRUE元素

library(dplyr)
library(purrr)
df1 %>%
mutate(isAnyType = reduce(., `|`))

或在base R中使用rowSums

df1$isAnyType <- rowSums(df1) > 0

或者另一个选项是pmap

df1 %>%
mutate(isAnyType = pmap_lgl(., ~ any(c(...)))

数据

df1 <- structure(list(typ1 = c(TRUE, FALSE, TRUE), typ2 = c(TRUE, FALSE, 
FALSE), typ3 = c(FALSE, FALSE, FALSE)), class = "data.frame", 
row.names = c(NA, 
-3L))

似乎可以在这里找到答案:在dplyr::mutate 中使用any((vs |

与使用整个数据帧的any((不同,我可以只使用OR运算符,这样mutate(isAnyType = typ1 |typ2 |typ3))就可以在中工作

如果您利用存储为T=1,F=0的布尔值,我相信您可以使用rowSums((函数按行计算T/F的实例。这就是你要找的吗?

输入:

df <- data.frame(typ1 = c(T, F, T),
typ2 = c(T,F, F),
typ3 = c(F, F, F))
library(dplyr)
df %>% 
mutate(typ4 = ifelse(rowSums(df) ==0, F, T))

输出:

typ1  typ2  typ3  typ4
1  TRUE  TRUE FALSE  TRUE
2 FALSE FALSE FALSE FALSE
3  TRUE FALSE FALSE  TRUE

最新更新