我有一个数据帧,看起来像这样:
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