【发布时间】:2020-04-27 17:30:21
【问题描述】:
我有一个如下所示的数据框:
typ1 typ2 typ3
T T F
F F F
T F F
我想改变第 4 个逻辑列来确定其他三个是否为 TRUE,所以 {T, F, T}。
mutate(isAnyType = any(typ1, typ2, typ3)) 似乎正在使用整个列,而我想使用每行的信息。任何见解都值得赞赏。
【问题讨论】:
我有一个如下所示的数据框:
typ1 typ2 typ3
T T F
F F F
T F F
我想改变第 4 个逻辑列来确定其他三个是否为 TRUE,所以 {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))
【讨论】:
看起来可以在这里找到答案: Using any() vs | in dplyr::mutate
我可以使用 OR 运算符,而不是使用整个数据帧的 any(),这样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
【讨论】: