使用%in%处理NA时行为不符合预期,寻求替代函数
解决方案:自定义匹配操作符处理NA逻辑
%in%的行为源于其底层调用的match()函数,该函数将NA视为可匹配的具体值,因此当目标向量包含NA时,输入的NA_character_会被判定为匹配,返回TRUE。若要实现NA与NA比较返回NA的逻辑,可以自定义一个操作符:
# 定义自定义操作符%na_in% `%na_in%` <- function(x, table) { sapply(x, function(val) { if (is.na(val)) { # 输入为NA时,若目标向量含NA则返回NA,否则返回FALSE if (any(is.na(table))) NA else FALSE } else { # 非NA输入保持%in%的原有逻辑 val %in% table } }) }
测试示例
# 正常匹配场景 "apple" %na_in% c("apple", "banana") # [1] TRUE "carrot" %na_in% c("apple", "banana") # [1] FALSE # NA匹配场景(符合预期返回NA) NA_character_ %na_in% c("apple", "banana", NA_character_) # [1] NA # 目标向量无NA时,输入NA返回FALSE NA_character_ %na_in% c("apple", "banana") # [1] FALSE # 向量输入场景 c("apple", NA_character_, "carrot") %na_in% c("apple", "banana", NA_character_) # [1] TRUE NA FALSE
替代简化方案(单个元素场景)
如果仅需处理单个元素的匹配,也可以直接用==结合any(),但需注意该方法在目标向量含NA且输入非匹配值时会返回NA(与%in%的FALSE行为不同):
# 输入NA,目标向量含NA,返回NA any(NA_character_ == c("apple", "banana", NA_character_)) # [1] NA # 输入非匹配值,目标向量含NA,返回NA(与%in%的FALSE不同) any("carrot" == c("apple", "banana", NA_character_)) # [1] NA
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

