与NA匹配的值-缺少值-使用mutate [英] Value matching with NA - missing values - using mutate
问题描述
我有些困惑。是否有比下面更好的方法来进行值匹配,将NA视为 mutate
内的真实值?
I am somewhat stuck. Is there a better way than the below to do value matching considering NAs as "real values" within 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
。我正在使用这种麻烦的辅助专栏。有更短的方法吗?
Desired output: The below shows the desired column, irr
. I am using this somewhat cumbersome helper columns. Is there a shorter way?
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
推荐答案
也许比 akrun的答案?
以下两种方式中的任何一种都会产生预期的结果。请注意, as.character
不会这样做,因为 as.character(NA)
的返回值为 NA_character _
。
Maybe simpler than akrun's answer?
Any of the two ways below will produce the expected result. Note that as.character
won't do it, because the return value of as.character(NA)
is NA_character_
.
data_foo %>%
mutate(irr = paste(A) == paste(B))
data_foo %>%
mutate(irr = sQuote(A) == sQuote(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 TRUE
#4 4 NA FALSE
#5 NA 4 FALSE
编辑。
- 在下面的注释之后,我更新了代码,现在它遵循akrun的建议。
- 在 tmfmnk的答案。我使用另一种类似的方法来解决问题的问题。
- Following the comments below I have updated the code and it now follows akrun's suggestion.
- There is also the excellent idea in tmfmnk's answer. I use a similar one in yet another way of solving the question's problem.
all.equal的文档
表示
请勿使用
all.equal
直接在if
表达式中使用
isTRUE(all.equal(....))
或相同
(如果适用)。
Do not use
all.equal
directly inif
expressions—either useisTRUE(all.equal(....))
oridentical
if appropriate.
尽管没有如果
表达式,我相信它比 mutate
中的if 相同
更稳定,并且具有如果所比较的值相等(实际上),则效果相同。
Though there is no if
expression in mutate
, I believe that it is more stable than identical
and has the same effect if the values being compared are (sort of/in fact) equal.
data_foo %>%
mutate(irr = isTRUE(all.equal(A, B)))
这篇关于与NA匹配的值-缺少值-使用mutate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!