如何在分组数据中判断两变量是否存在共同值并生成过滤变量?
分组内判断两变量是否存在交集并生成过滤变量
问题描述
需要按group分组,生成新变量desired_filter:若该组内value_A的非NA值与value_B的非NA值存在任意相同值,则组内所有行该变量为TRUE,否则为FALSE。
示例数据:
require(tidyverse) base <- tibble( group = rep(c("A", "B", "C"), each = 4), value_A = c("a", NA_character_, "b", NA_character_, NA_character_, "c", NA_character_, NA_character_, NA_character_, "a", "c", NA_character_), value_B = c(NA_character_, "c", NA_character_, NA_character_, NA_character_, "c", "b", NA_character_, "a", NA_character_, NA_character_, "c") )
期望结果:
desired_outcome <- base |> mutate(desired_filter = rep(c(FALSE, TRUE, TRUE), each = 4))
简洁健壮的解决方案
直接通过分组后判断两组非NA值的交集是否非空生成目标变量,无需复杂填充或中间变量:
base %>% group_by(group) %>% mutate(desired_filter = !is_empty(intersect(na.omit(value_A), na.omit(value_B)))) %>% ungroup()
等价写法(用any()判断集合交集):
base %>% group_by(group) %>% mutate(desired_filter = any(na.omit(value_A) %in% na.omit(value_B))) %>% ungroup()
方案说明
na.omit(value_A)提取该组value_A的所有非NA值,intersect()计算其与value_B非NA值的交集!is_empty()或any()判断交集是否存在,返回的逻辑值会应用到组内所有行- 该方法不依赖NA的位置或填充逻辑,适用于所有NA分布场景,比原方案更健壮且代码简洁
原方案的局限性
你之前的填充方案依赖fill()将NA替换为最近的非NA值,这种方式在组内value_B存在多个不同非NA值时,无法覆盖所有可能的交集情况,可能导致错误判断。而直接基于集合交集的方法则避免了这个问题。
内容的提问来源于stack exchange,提问作者Rich.a.rd
相关产品推荐
相关产品推荐

