如何基于category是否包含于mix_category关联base_table与value_table
基于字符匹配的表关联实现(R tidyverse)
先定义两张原始数据表:
library(tidyverse) base_table <- data.frame(mix_category = c('ABC','WE','CF','Z236')) # mix_category # 1 ABC # 2 WE # 3 CF # 4 Z236 value_table <- data.frame(category = c('A','F','W','E','C','2'), value = c('1','2','3','6','0','-1')) # category value # 1 A 1 # 2 F 2 # 3 W 3 # 4 E 6 # 5 C 0 # 6 2 -1
需求1:返回首个匹配的category和value
若mix_category中能匹配到category,返回value_table里第一个匹配的对应字段,期望结果如下:
# mix_category category value # 1 ABC A 1 # 2 WE W 3 # 3 CF C 0 # 4 Z236 2 -1
实现代码
base_table %>% mutate( category = map_chr(mix_category, ~ value_table$category[str_detect(.x, value_table$category)][1]), value = map_chr(category, ~ value_table$value[value_table$category == .x]) )
核心逻辑:对每个mix_category,用str_detect筛选出所有匹配的category,取第一个结果;再根据该category关联对应的value值。
需求2:返回所有匹配结果并拼接
若mix_category中匹配到多个category,将所有匹配的category和value分别用_拼接成字符串,期望结果如下:
# mix_category category value # 1 ABC A_C 1_0 # 2 WE W_E 3_6 # 3 CF C_F 0_2 # 4 Z236 2 -1
实现代码
base_table %>% mutate( category = map_chr(mix_category, ~ paste(value_table$category[str_detect(.x, value_table$category)], collapse = "_")), value = map_chr(category, ~ paste(value_table$value[value_table$category %in% str_split(.x, "_")[[1]]], collapse = "_")) )
核心逻辑:对每个mix_category,先筛选出所有匹配的category并拼接成字符串;再拆分拼接后的category,关联对应的value值后再次拼接。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

