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

基于两个data.frame匹配结果筛选第三个data.frame的R实现问题

R语言数据筛选解决方案

数据定义

首先定义三个data.frame:

area1 <- data.frame(ua = c(1, 2, 3),
                   sub_ua1 = c(0, 100, 0),
                   sub_ua2 = c(100, 100, 100),
                   sub_ua3 = c(100, 0, 0))

area2 <- data.frame(ua = c(1, 2, 3),
                    sub_ua1 = c(100, 100, 0),
                    sub_ua2 = c(100, 100, 0),
                    sub_ua3 = c(100, 0, 0))

df <- data.frame(ua = c(rep(1, 5), rep(2, 4), rep(3, 7)),
                 subua = c(rep("sub_ua1", 3), "sub_ua2", "sub_ua3",
                           "sub_ua1", "sub_ua1", "sub_ua2", "sub_ua3",
                           "sub_ua1", rep("sub_ua2", 2), rep("sub_ua3", 4)),
                 value = c(rep(2, 3), rep(4, 3), rep(2, 2), rep(1, 8)))

需求说明

  1. 基于area1和area2的ua列,筛选出每个ua对应的、在两个数据框中值均为100的sub_ua(即sub_ua1/sub_ua2/sub_ua3):
    • ua=1时,保留sub_ua2和sub_ua3
    • ua=2时,保留sub_ua1和sub_ua2
    • ua=3时,保留sub_ua2
  2. 用上述筛选出的有效sub_ua列表,对df进行筛选,得到对应的value数据。

已尝试代码

用户已尝试通过索引匹配获取符合条件的位置,但不知道如何进一步筛选df:

library(prodlim)
# 获取两个数据框中值为100的行列索引
indices_1 <- which(area1 == 100, arr.ind = TRUE)
indices_2 <- which(area2 == 100, arr.ind = TRUE)

# 匹配两个索引数据框中相同的行
indices_rows <- na.omit(row.match(as.data.frame(indices_1), as.data.frame(indices_2)))

# 获取两个数据框中均为100的行列索引
indices_2[indices_rows, ]

解决方案

步骤1:生成有效ua-subua映射表

先将宽格式的area1和area2转为长格式,再筛选出两个表中值均为100的组合:

library(tidyr)

# 转换为长格式
area1_long <- pivot_longer(area1, cols = starts_with("sub_ua"), 
                           names_to = "subua", values_to = "val1")
area2_long <- pivot_longer(area2, cols = starts_with("sub_ua"), 
                           names_to = "subua", values_to = "val2")

# 合并并筛选有效组合
valid_pairs <- merge(area1_long, area2_long, by = c("ua", "subua")) %>%
  filter(val1 == 100 & val2 == 100) %>%
  select(ua, subua)

步骤2:筛选目标数据df

通过两种方式均可完成筛选,结果一致:

# 方法1:使用inner_join关联筛选
result_df <- inner_join(df, valid_pairs, by = c("ua", "subua"))

# 方法2:使用字符串匹配筛选
result_df <- df %>%
  filter(paste(ua, subua) %in% paste(valid_pairs$ua, valid_pairs$subua))

验证筛选结果:

split(result_df$subua, result_df$ua)
# 输出符合预期:
# $`1`
# [1] "sub_ua2" "sub_ua3"
# 
# $`2`
# [1] "sub_ua1" "sub_ua1" "sub_ua2"
# 
# $`3`
# [1] "sub_ua2" "sub_ua2"

内容的提问来源于stack exchange,提问作者hiperhiper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:25:29