在R中基于姓名数据框预测用户性别:重名时按计数判定
基于姓名计数判定客户性别的实现方案
可以通过数据连接+规则判断的方式实现需求,下面提供两种常用的R语言实现方法:
方法一:使用dplyr(简洁易读,推荐)
先加载dplyr包,通过左连接获取每个客户对应的男女姓名计数,再按规则判定性别:
library(dplyr) # 连接客户表与男女姓名计数表,补全缺失计数为0 customer_gender <- customer_names %>% left_join(male_names, by = "Name", suffix = c("", "_male")) %>% left_join(female_names, by = "Name", suffix = c("", "_female")) %>% mutate( count_male = ifelse(is.na(count_male), 0, count_male), count_female = ifelse(is.na(count_female), 0, count_female) ) %>% # 按规则判定性别 mutate( Gender = case_when( count_male > count_female ~ "男性", count_female > count_male ~ "女性", count_male == count_female ~ "未知" # 计数相等时的处理,可按需调整 ) ) %>% select(Name, Gender) # 查看结果 print(customer_gender)
结果输出:
Name Gender 1 Ajit 男性 2 Binita 女性 3 Dhiraj 男性 4 Krishna 男性
逻辑说明:
left_join确保所有客户姓名被保留,同时匹配到对应的性别计数;- 把缺失的计数替换为0,方便后续比较(不存在于某性别表的姓名,对应计数视为0);
case_when按规则分支判断:- 仅存在于男性表 →
count_female=0,判定为男性; - 仅存在于女性表 →
count_male=0,判定为女性; - 同时存在于两表 → 比较计数大小,取计数更高的性别。
- 仅存在于男性表 →
方法二:使用Base R(无需额外包)
如果不想加载第三方包,可以用Base R的合并和聚合函数实现:
# 合并男女姓名表并添加性别标识 gender_counts <- rbind( transform(male_names, Gender = "男性"), transform(female_names, Gender = "女性") ) # 对每个姓名,筛选出计数最大的性别 max_gender <- aggregate(count ~ Name, data = gender_counts, FUN = function(x) { target_rows <- gender_counts[gender_counts$Name == unique(x$Name) & gender_counts$count == max(x), ] if(nrow(target_rows) > 1) "未知" else target_rows$Gender }) # 匹配客户姓名得到最终结果 customer_gender_base <- merge(customer_names, max_gender, by = "Name", all.x = TRUE) colnames(customer_gender_base)[2] <- "Gender" # 查看结果 print(customer_gender_base)
逻辑说明:
- 先合并男女姓名表,给每条记录打上性别标签;
- 用
aggregate按姓名分组,找出每组中计数最大的性别; - 最后将结果与客户表匹配,得到每个客户的性别。
内容的提问来源于stack exchange,提问作者Priyansh
相关产品推荐
相关产品推荐

