下方的输入表中的数据点为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)
您可以使用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)
为了简化起见,让我们首先使用以下命令重新定义数据框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)
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |