You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在分组数据中判断两变量是否存在共同值并生成过滤变量?

分组内判断两变量是否存在交集并生成过滤变量

问题描述

需要按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:35:25