基于另一数据框的部分字符串匹配为DF1添加对应party.number列
解决方案:给DF1新增对应政党编号列
我来帮你搞定这个需求,咱们可以用tidyverse工具包一步步处理,核心思路是先拆分含多个政党的行,匹配到编号后再合并回原结构,具体操作如下:
1. 先加载必要的工具包
如果还没安装tidyverse,先执行安装命令:
install.packages("tidyverse")
然后加载包:
library(tidyverse)
2. 准备原始数据(方便复现验证)
先把你给出的DF1和DF2代码整理成更简洁的写法:
# 构建DF1 DF1 <- data.frame(parties = c("A, B","C","A","C, D")) # 构建DF2 DF2 <- tibble( party = LETTERS[1:10], party.number = 1:10 )
3. 核心处理:拆分、匹配、合并编号
这一步是关键,我们通过临时行号来确保拆分后的数据能准确合并回原结构:
# 给DF1添加临时行号,用于后续匹配 DF1_with_id <- DF1 %>% mutate(row_id = row_number()) # 拆分多政党行 → 匹配编号 → 合并回逗号分隔格式 party_number_list <- DF1_with_id %>% # 按逗号拆分parties列,每行保留原行号 separate_rows(parties, sep = ",") %>% # 清理政党名称前后的空格(比如"A, B"拆分后会出现" B") mutate(parties = str_trim(parties)) %>% # 左连接DF2,获取对应的政党编号 left_join(DF2, by = c("parties" = "party")) %>% # 按原行号分组,把同组的编号合并成逗号分隔的字符串 group_by(row_id) %>% summarise(party_numbers = str_c(party.number, collapse = ", ")) %>% ungroup() # 把编号列合并回原始DF1,去掉临时行号 DF1_final <- DF1_with_id %>% left_join(party_number_list, by = "row_id") %>% select(-row_id)
4. 查看最终结果
运行完上述代码后,DF1_final就是你需要的结果:
> DF1_final parties party_numbers 1 A, B 1, 2 2 C 3 3 A 1 4 C, D 3, 4
这样就完美实现了给DF1新增对应政党编号列的需求啦~
内容的提问来源于stack exchange,提问作者zoowalk
相关产品推荐
相关产品推荐

