如何用R语言dplyr包验证生产数据框组合是否匹配参考数据框?
用dplyr实现二元组合匹配需求
核心思路
先拆分df2中逗号分隔的变量,按日期生成所有合法二元组合,再与df1的组合匹配取值,同时单独处理单变量场景。
分步实现
拆分变量列
用separate_rows()把每个日期下的逗号分隔变量拆成多行,为后续生成组合做准备。生成组合并处理单变量
- 按日期分组后,若组内只有1个变量,直接返回该变量,对应val设为0;
- 若组内有多个变量,用
combn()生成所有二元组合,对组合内变量排序后拼接,确保和df1的组合格式统一(避免因顺序差异导致匹配失败)。
匹配参考数据取值
将生成的组合与df1拼接后的组合列匹配,过滤掉df1中不存在的组合,对匹配到的组合保留对应val,未匹配的(含单变量)设为0。
完整代码
library(tidyverse) # 构建示例数据 first = c("A","A","A","B","B","C","H") second = c("B","C","D","C","D","D","I") val = c(10,20,30,40,50,60,70) df1 = tibble(first,second,val) date = c(as.Date("2022-01-01"),as.Date("2022-02-01")) var = c("A","B,C,F,E,G,H,I") df2 = tibble(date,var) # 实现逻辑 result <- df2 %>% # 拆分逗号分隔变量为独立行 separate_rows(var, sep = ",") %>% group_by(date) %>% summarise( comb = if(n() == 1) { var } else { # 生成二元组合并排序拼接,对齐df1格式 combn(var, 2, function(x) str_c(sort(x), collapse = ",")) }, .groups = "drop" ) %>% # 与df1匹配:先把df1的first和second拼接成comb列 left_join( df1 %>% mutate(comb = str_c(first, second, sep = ",")), by = "comb" ) %>% # 赋值val:匹配到的用原值,未匹配的(含单变量)设为0 mutate(val = ifelse(is.na(val), 0, val)) %>% # 保留目标列,过滤掉df2生成但df1不存在的二元组合 select(date, comb, val) %>% filter(!(str_detect(comb, ",") & val == 0)) print(result)
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

