【问题标题】:Deal with NAs in conditional column处理条件列中的 NA
【发布时间】:2018-10-17 09:39:20
【问题描述】:

我有一个df等数据框,想创建列生成df2。

df <- data.frame(bind_cols(x = c('N', 'Y', 'N', 'Y', 'N'),
                   y = c(NA, 'N', 'Y', 'Y', 'N')))

df2 <- data.frame(bind_cols(x = c('N', 'Y', 'N', 'Y', 'N'),
                        y = c(NA, 'N', 'Y', 'Y', 'N'),
                        any = c('N', 'Y', 'Y', 'Y', 'N'),
                        both = c('N', 'N', 'N', 'Y', 'N')))

如果 x 和 y 中的一个或另一个或两者都 == 'Y',则新列 'any' 应该 = 'Y'。如果 x 和 y == 'Y',则两者都应该 ='Y'。 我还没有弄清楚如何处理第一行中的 NA 以使 any = 'Y'。我目前的策略如下,但在第 1 行“任何”列中给出了 NA,我想在其中 =“Y”。即使有 NA 值,如何更改代码以给出 Y 的结果?

df2 <- df %>% 
  mutate(any = case_when(x =='Y'|y=='Y' ~'Y',
                         x != 'Y' & y != 'Y' ~ 'N'),
                both = ifelse(x=='Y'& y=='Y', 'Y', 'N')) 

【问题讨论】:

    标签: r dataframe dplyr conditional


    【解决方案1】:

    您可以将基础 R 中的 anyall 函数与 na.rm = T 一起使用。它们都作用于向量,因此您需要在 mutates 之前添加 rowwise,以便将每行的 xy 值一起视为向量,而不是所有 x 值和所有 @ 987654330@ 值。

    library(tidyverse)
    
    df %>%
        rowwise() %>%
        mutate(any = ifelse(any(x == "Y", y == "Y", na.rm = T), "Y", "N")) %>%
        mutate(both = ifelse(all(x == "Y", y == "Y", na.rm = T), "Y", "N"))
    #> Source: local data frame [5 x 4]
    #> Groups: <by row>
    #> 
    #> # A tibble: 5 x 4
    #>   x     y     any   both 
    #>   <chr> <chr> <chr> <chr>
    #> 1 N     <NA>  N     N    
    #> 2 Y     N     Y     N    
    #> 3 N     Y     Y     N    
    #> 4 Y     Y     Y     Y    
    #> 5 N     N     N     N
    

    reprex package (v0.2.0) 于 2018 年 5 月 7 日创建。

    【讨论】:

      【解决方案2】:

      您可以尝试case_whenifelse。直接使用%in% 而不是== 处理NA

      df %>% 
        mutate(any=case_when(x %in% "Y" | y %in% "Y" ~ "Y", TRUE ~ "N"),
               both=ifelse(x %in% "Y" & y %in% "Y", "Y", "N"))
        x    y any both
      1 N <NA>   N    N
      2 Y    N   Y    N
      3 N    Y   Y    N
      4 Y    Y   Y    Y
      5 N    N   N    N
      

      不需要rowwise

      【讨论】:

      • 谢谢。你能解释为什么 == 和 %in% 的行为不同吗?
      • @user42485 请查看?match。 %in% 从不返回 NA 使其在 if 条件下特别有用。
      猜你喜欢
      • 2018-10-28
      • 2013-03-14
      • 2021-09-03
      • 1970-01-01
      • 2023-01-19
      • 2015-01-04
      • 2020-12-15
      • 2012-07-17
      • 2014-12-28
      相关资源
      最近更新 更多