比较列值和NA

Che*_*til 1 r dataframe

下方的输入表中的数据点为NA。我知道R何时将值与之比较NA会导致输出被存在NA。

还有没有办法让我仍然可以比较使用ifelse()并确保所比较的值之一NA是否仍然可以像NA被比较的字符/字符串那样提供输出?

输入原始数据

data <- read.table(header = TRUE, text = "A B
                    NA  TEST
                   TEST TEST
                   Abaxasdas Test")
Run Code Online (Sandbox Code Playgroud)

输入数据表

 A       B
<NA>   TEST
TEST   TEST
Abaxasdas Test
Run Code Online (Sandbox Code Playgroud)

码

data$Output <- ifelse(as.character(data$A) == as.character(data$B), "YES", "NO")
Run Code Online (Sandbox Code Playgroud)

输出量

 A    B   Output
<NA> TEST  <NA>
TEST TEST  YES
Abaxasdas Test NO

Run Code Online (Sandbox Code Playgroud)

预期产量

 A    B   Output
<NA> TEST  NO
TEST TEST  YES
Abaxasdas Test NO
Run Code Online (Sandbox Code Playgroud)

Ice*_*can 6

您可以使用case_whendplyr。将第一个案例的输出调整为您想要的任何内容。

library(dplyr)

df %>% 
  mutate(output = case_when(is.na(A) & is.na(B) ~ NA_character_,
                            is.na(A) | is.na(B) ~ 'NO', 
                            A == B ~ 'YES',
                            TRUE ~ 'NO'))
#           A    B output
# 1      <NA> TEST     NO
# 2      TEST TEST    YES
# 3 Abaxasdas Test     NO
Run Code Online (Sandbox Code Playgroud)


leb*_*nok 5

为了简化起见,让我们首先使用以下命令重新定义数据框stringsAsFactors=FALSE:

df <- read.table(header = TRUE, text = "A B
                     NA  TEST
                    TEST TEST
                    Abaxasdas Test", stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

您可以NA使用-safe方法比较列identical:

mapply(identical, df$A, df$B)
Run Code Online (Sandbox Code Playgroud)

用“ YES”和“ NO”代替TRUEand 获得输出FALSE:

ifelse(mapply(identical, df$A, df$B), "YES", "NO")
Run Code Online (Sandbox Code Playgroud)

输出量

> df$Output <- ifelse(mapply(identical, df$A, df$B), "YES", "NO")
> df
          A    B Output
1      <NA> TEST     NO
2      TEST TEST    YES
3 Abaxasdas Test     NO
Run Code Online (Sandbox Code Playgroud)

替代

正如joran在评论中所建议的那样,用值替换NA将使比较容易。如果您不想更改数据框中的值(但也许应该!),则可以使用如下帮助函数:

rna <- function(x) replace(x, is.na(x), "")
ifelse(rna(df$A)==rna(df$B), "YES", "NO")
Run Code Online (Sandbox Code Playgroud)