R语言中提取数据框B中未在A出现的项(忽略大小写与别名)
R语言数据框名称匹配问题
我有两个数据框:
A <- data.frame(c("Nick", "Maria", "Liam", "Oliver", "Sophia", "james", "Lucas; Luc")) B <- data.frame(c("Liam", "Luc", "Evelyn; Eva", "James", "Harper", "Amelia"))
需要创建数据框C,包含数据框B中未在数据框A里出现的名称,要求:
- 忽略大小写(比如
James和james视为同一名称) - 分号分隔的别名(比如
Lucas; Luc)视为同一名称
最终预期结果:
C <- data.frame(c("Evelyn; Eva", "Harper","Amelia"))
解决方案
步骤1:统一格式并拆分别名
先把两个数据框的名称统一转为小写,再拆分分号分隔的别名,整理出A中包含的所有名称集合:
# 处理数据框A:提取所有别名并转为小写 A_names <- tolower(unlist(strsplit(as.character(A[[1]]), ";\\s*"))) # 处理数据框B:保留原始条目,同时提取每个条目的小写别名 B_processed <- data.frame( original = B[[1]], aliases = lapply(strsplit(as.character(B[[1]]), ";\\s*"), tolower) )
步骤2:筛选B中未在A出现的条目
检查B的每个条目里的所有别名,只要有一个别名存在于A的名称集合中,就排除该条目;反之则保留:
# 判断B的每个条目是否有别名在A中存在 B_in_A <- sapply(B_processed$aliases, function(x) any(x %in% A_names)) # 筛选出符合条件的条目,创建数据框C C <- data.frame(original = B_processed$original[!B_in_A])
验证结果
运行代码后,C的输出与预期一致:
> C original 1 Evelyn; Eva 2 Harper 3 Amelia
内容的提问来源于stack exchange,提问作者nickolakis
相关产品推荐
相关产品推荐

