【问题标题】:Creating multiple new columns within a DF depending on the the order of logical columns根据逻辑列的顺序在 DF 中创建多个新列
【发布时间】:2020-09-26 09:21:02
【问题描述】:

我正在尝试创建三个新列,其值取决于三个逻辑类型列的特定顺序。

例如我有这个:

     a     b    c 
1 TRUE  TRUE TRUE
2 TRUE FALSE TRUE
3 TRUE FALSE TRUE

如果跨行,则值是 TRUE、TRUE、TRUE,如第 1 行,然后创建三个新列,其值为 1、1、1,但如果顺序为 TRUE、FALSE、TRUE,如第 2 行和 3 那么值将是 2,3,3。请注意,TRUE 的值不 = 1,而是我根据所有三个逻辑值定义的值(总共 8 种可能的组合,每个组合由三个单独的数字定义)。所以我得到了这样的东西:

     a     b    c d e f
1 TRUE  TRUE TRUE 5 5 2
2 TRUE FALSE TRUE 2 3 3
3 TRUE FALSE TRUE 2 3 3

如果有人能指出我正确的方向以尽可能高效地做到这一点,我将不胜感激,因为我对 R 比较陌生。

【问题讨论】:

    标签: r dataframe tidyverse data-wrangling


    【解决方案1】:

    如果在获取列的值时没有逻辑并且您需要为每个组合单独添加条件,您可以使用if/else

    df[c('d', 'e', 'f')] <- t(apply(df, 1, function(x) {
                              if (x[1] && x[2] && x[3]) c(5, 5, 2)
                              else if (x[1] && !x[2] && x[3]) c(2, 3, 3)
                              #add more conditions
                              #....
                              }))
    
    df
    #     a     b    c d e f
    #1 TRUE  TRUE TRUE 5 5 2
    #2 TRUE FALSE TRUE 2 3 3
    #3 TRUE FALSE TRUE 2 3 3
    

    【讨论】:

      【解决方案2】:

      这是使用case_whendplyr 解决方案。在~ 的左侧,您定义您的条件,在~ 的右侧,您为满足这些条件时分配一个值。如果不满足某个条件(即所有 FALSE 值),您将返回 NA

      df %>% 
        mutate(d = 
                 case_when(
                   a == TRUE & b == TRUE & c == TRUE ~ 5,
                   a == TRUE & b == FALSE & c == TRUE ~ 2
                 ),
               e = 
                 case_when(
                   a == TRUE & b == TRUE & c == TRUE ~ 5,
                   a == TRUE & b == FALSE & c == TRUE ~ 3
                 ),
               f = 
                 case_when(
                   a == TRUE & b == TRUE & c == TRUE ~ 2,
                   a == TRUE & b == FALSE & c == TRUE ~ 3
                 ))
      

      这给了你:

        a     b     c         d     e     f
        <lgl> <lgl> <lgl> <dbl> <dbl> <dbl>
      1 TRUE  TRUE  TRUE      5     5     2
      2 TRUE  FALSE TRUE      2     3     3
      3 TRUE  FALSE TRUE      2     3     3
      

      数据:

      df <- tribble(
        ~a, ~b, ~c,
        TRUE, TRUE, TRUE,
        TRUE, FALSE, TRUE,
        TRUE, FALSE, TRUE
      )
      

      【讨论】:

        猜你喜欢
        • 2023-01-23
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多