基于两个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)))
需求说明
- 基于
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
- 用上述筛选出的有效
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
相关产品推荐
相关产品推荐

