代码之家  ›  专栏  ›  技术社区  ›  ah bon

使用R根据另一列的条件更新一列(使用NAs)

  •  0
  • ah bon  · 技术社区  · 4 年前

    给出一个小数据集,如下所示:

    df <- structure(list(date = c("2021-09", "2021-10", "2021-11", "2021-12", 
    "2021-06", "2021-10"), act_direction = c("decrease", "increase", 
    NA, NA, "unchanged", "unchanged"), pred_direction = c(NA, "decrease", 
    NA, NA, "decrease", "increase"), direction_acc = c("true", "-", 
    "-", "true", "false", "false")), class = "data.frame", row.names = c(NA, 
    -6L))
    

    df:

         date act_direction pred_direction direction_acc
    1 2021-09      decrease           <NA>          true
    2 2021-10      increase       decrease             -
    3 2021-11          <NA>           <NA>             -
    4 2021-12          <NA>           <NA>          true
    5 2021-06     unchanged       decrease         false
    6 2021-10     unchanged       increase         false
    

    我尝试更新 direction_acc 基于 act_direction 列,更具体地说,如果 act_direction==unchanged ,然后我想更新到的内容 方向(附件) 到 true ,忽略其原始值。

    预期结果:

         date act_direction pred_direction direction_acc
    1 2021-09      decrease           <NA>          true
    2 2021-10      increase       decrease             -
    3 2021-11          <NA>           <NA>             -
    4 2021-12          <NA>           <NA>          true
    5 2021-06     unchanged       decrease          true
    6 2021-10     unchanged       increase          true
    

    我使用了下面的代码,我没有发现任何错误,但它返回的结果超出了预期,因为其他值 方向(附件) 改为 NA s:

    df %>% 
      # mutate_all(na_if, '') %>% # I will replace empty cell '' to NA as example data
      mutate(direction_acc = ifelse(act_direction == 'unchanged', 
                                    'true', 
                                    as.character(direction_acc)))
    

    结果:

         date act_direction pred_direction direction_acc
    1 2021-09      decrease           <NA>          true
    2 2021-10      increase       decrease             -
    3 2021-11          <NA>           <NA>          <NA>
    4 2021-12          <NA>           <NA>          <NA>
    5 2021-06     unchanged       decrease          true
    6 2021-10     unchanged       increase          true
    

    所以我的问题是为什么 行动方向 具有 NA s 方向(附件) 也成为 NA s、 我们如何才能正确地做到这一点?

    1 回复  |  直到 4 年前
        1
  •  1
  •   r2evans    4 年前

    基尔

    df$direction_acc[df$act_direction == "unchanged"] <- "true"
    df
    #      date act_direction pred_direction direction_acc
    # 1 2021-09                                       true
    # 2 2021-10                     decrease             -
    # 3 2021-11                                          -
    # 4 2021-12                                       true
    # 5 2021-06     unchanged       decrease          true
    # 6 2021-10     unchanged       increase          true
    

    dplyr

    library(dplyr)
    df %>%
      mutate(
        direction_acc = if_else(act_direction == "unchanged", "true", direction_acc)
      )
    

    如果我加上 NA 如你所愿(我将使用 across 像 mutate_if 不推荐),然后我们可以更改 == 到 %in% 为了达到预期的效果。

    df %>%
      mutate(across(where(is.character), ~ na_if(., ""))) %>%
      mutate(
        direction_acc = if_else(act_direction %in% "unchanged", "true", direction_acc)
      )
    #      date act_direction pred_direction direction_acc
    # 1 2021-09          <NA>           <NA>          true
    # 2 2021-10          <NA>       decrease             -
    # 3 2021-11          <NA>           <NA>             -
    # 4 2021-12          <NA>           <NA>          true
    # 5 2021-06     unchanged       decrease          true
    # 6 2021-10     unchanged       increase          true