我的数据框有两列,可以取left
或right
的值。
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行的结果有什么不同?
答案 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
。