【问题标题】:In dplyr, mutate a logical column where any of a set of other logical columns are true在 dplyr 中,改变一个逻辑列,其中任何一组其他逻辑列为真
【发布时间】: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)) 似乎正在使用整个列,而我想使用每行的信息。任何见解都值得赞赏。

【问题讨论】:

    标签: r dplyr any


    【解决方案1】:

    我们可以使用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))
    

    【讨论】:

      【解决方案2】:

      看起来可以在这里找到答案: Using any() vs | in dplyr::mutate

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

      【讨论】:

        【解决方案3】:

        如果您利用存储为 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
        

        【讨论】:

          猜你喜欢
          • 2023-02-10
          • 1970-01-01
          • 2021-06-28
          • 2010-09-19
          • 2016-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多