R:两列上的逻辑运算,说明两者中是否存在NA

时间:2015-08-08 08:44:58

标签: r logical-operators

我的数据框有两列,可以取leftright的值。

test_df <- data.frame(col1 = c("right","left","right",NA),
                      col2 = c("left","right",NA,"right"))

test_df

#    col1  col2
# 1 right  left
# 2  left right
# 3 right  <NA>
# 4  <NA> right

现在我想测试这个多重条件

test_df$col1 == "left" | test_df$col2 == "right"

# [1] FALSE  TRUE    NA  TRUE

前三个结果符合预期,但为什么最后的结果是TRUE而不是NA。第3行和第4行的结果有什么不同?

1 个答案:

答案 0 :(得分:1)

在您的代码中,您正在测试是否满足以下条件中的至少一个条件; col1中的“left”或col2中的“right”。在第4行中,col2中有“right”,因此结果为TRUE,无论col1中可能有什么内容,也可能没有。第3行的情况不同。在那里,col1不包含“left”,因此,如果col2包含“right”以便断定语句是FALSE还是TRUE,还有待观察。但是,由于第3行第2行中的条目为NA,因此无法确定比较结果,因此输出为NA

如果你想拥有一个函数来执行你提到的col1和col2中的条目之间的比较,但是如果这两列中的条目的任何NA,则返回NA {{ 1}},您可以使用

as.logical((test_df$col1 == "left") + (test_df$col2 == "right"))
#[1] FALSE  TRUE    NA    NA

在这行代码中,TRUE运算符将单个比较的结果FALSE+强制转换为数值。如果总和的任何部分为NA,则总和将为NA。这个添加是针对数据帧的每一行完成的,因此结果是一个长度为nrow(test_df)的向量。

通过使用as.logical(),括号中计算的总和的结果将转换回逻辑值。同样,这是为向量的每个元素完成的。如果总和为零,则结果为FALSE,如果为NA,则结果为NA。任何非零整数都将转换为TRUE