r - 与 NA 匹配的值 - 缺失值 - 使用 mutate

标签 r dplyr

我有点卡住了。有没有比下面更好的方法来进行值匹配,将 NA 视为 mutate 中的“实际值”?

library(dplyr)

data_foo <- data.frame(A= c(1:2, NA, 4, NA), B = c(1, 3, NA, NA, 4))

不是所需的输出:

data_foo %>% mutate(irr = A==B)

#>    A  B   irr
#> 1  1  1  TRUE
#> 2  2  3 FALSE
#> 3 NA NA    NA
#> 4  4 NA    NA
#> 5 NA  4    NA

data_foo %>% rowwise() %>% mutate(irr = A%in%B)

#> Source: local data frame [5 x 3]
#> Groups: <by row>
#> 
#> # A tibble: 5 x 3
#>       A     B irr  
#>   <dbl> <dbl> <lgl>
#> 1     1     1 TRUE 
#> 2     2     3 FALSE
#> 3    NA    NA FALSE
#> 4     4    NA FALSE
#> 5    NA     4 FALSE

所需输出:下面显示了所需的列,irr。我正在使用这个有点麻烦的辅助列。有没有更短的方法?

data_foo %>% 
  mutate(NA_A = is.na(A), 
         NA_B = is.na(B), 
         irr = if_else(is.na(A)|is.na(B), NA_A == NA_B, A == B))

#>    A  B  NA_A  NA_B   irr
#> 1  1  1 FALSE FALSE  TRUE
#> 2  2  3 FALSE FALSE FALSE
#> 3 NA NA  TRUE  TRUE  TRUE
#> 4  4 NA FALSE  TRUE FALSE
#> 5 NA  4  TRUE FALSE FALSE

最佳答案

使用map2

library(tidyverse)
data_foo %>%
   mutate(irr = map2_lgl(A, B, `%in%`))
#   A  B   irr
#1  1  1  TRUE
#2  2  3 FALSE
#3 NA NA  TRUE
#4  4 NA FALSE
#5 NA  4 FALSE
<小时/>

或者使用setequal

data_foo %>% 
   rowwise %>%
   mutate(irr = setequal(A, B))
<小时/>

上面的方法虽然简洁,但也有循环。我们可以用不同的值替换 NA,然后执行 ==

data_foo %>%
     mutate_all(list(new = ~ replace_na(., -999))) %>%
     transmute(A, B, irr = A_new == B_new)
#   A  B   irr
#1  1  1  TRUE
#2  2  3 FALSE
#3 NA NA  TRUE
#4  4 NA FALSE
#5 NA  4 FALSE
<小时/>

或者使用bind_colsreduce

data_foo %>%
    mutate_all(replace_na, -999) %>% 
    reduce(`==`) %>% 
    bind_cols(data_foo, irr = .)

关于r - 与 NA 匹配的值 - 缺失值 - 使用 mutate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56635295/

相关文章:

r - 如何将值与 SAS 或 R 中的范围进行比较

r - 使用 Case_when

R 如果满足条件或者是特定行号,则删除行

r - dplyr 不按日期对数据进行分组

r - 使用 SPADE 解释序列挖掘的结果

r - 带有 ggmap 的 R 中自定义属性的地理热图

R - group_by n_distinct 总结

r - 使用行中上一个日期的下一个日期填充日期列

r - 合并数据帧,优先级高于另一个

r - 如何在列上使用 tidyeval 进行变异?