You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中使用gender包提取姓名性别信息失败的解决求助

解决R gender包ssa方法行数不匹配问题

核心问题原因

gender()函数使用ssa方法时,仅返回在社保数据集中匹配到的名字结果,未匹配的名字不会出现在返回值里,直接赋值会导致结果行数与原数据行数不一致,触发报错。

具体解决步骤

1. 清洗名字格式

ssa数据集仅识别单名,先处理带后缀的名字(比如"annie j"),提取首名部分,同时统一大小写避免匹配失败:

library(stringr)
# 提取第一个空格前的名字,转为首字母大写格式
demo1$first_name_clean <- str_to_title(sub(" .*", "", demo1$first_name))

2. 用左连接合并结果

先获取匹配到的性别数据,再通过left_join与原数据合并,未匹配的名字会自动填充为NA,避免行数不匹配:

library(gender)
library(dplyr)

# 获取ssa方法的性别结果
gender_ssa <- gender(demo1$first_name_clean, method = "ssa")

# 左连接原数据与性别结果
demo1 <- demo1 %>%
  left_join(gender_ssa, by = c("first_name_clean" = "name"))

3. 结合genderize方法补全未匹配数据

对于非英文名(比如"liyuan"),ssa数据集无记录,可以用genderize方法(基于多语言名字数据库)补全NA值:

# 提取未匹配到的名字
na_names <- demo1$first_name_clean[is.na(demo1$gender)]

# 用genderize获取这些名字的性别(需联网,有调用频次限制)
gender_genderize <- gender(na_names, method = "genderize")

# 补全原数据中的NA值
demo1$gender <- ifelse(is.na(demo1$gender),
                       gender_genderize$gender[match(demo1$first_name_clean, gender_genderize$name)],
                       demo1$gender)

4. 处理剩余NA值

对于仍未匹配到的名字,可以手动标记为"unknown":

demo1$gender <- replace(demo1$gender, is.na(demo1$gender), "unknown")

最终完整代码示例

library(gender)
library(dplyr)
library(stringr)

# 原始数据
unique_id <- seq(0:6)
first_name <- c("annie j", "Juan", "Richard", "Aj",
                "Dana", "annie j", "liyuan")
demo1 <- as.data.frame(cbind(unique_id, first_name))

# 清洗名字
demo1$first_name_clean <- str_to_title(sub(" .*", "", demo1$first_name))

# 获取ssa性别结果并合并
gender_ssa <- gender(demo1$first_name_clean, method = "ssa")
demo1 <- demo1 %>%
  left_join(gender_ssa, by = c("first_name_clean" = "name"))

# 用genderize补全NA
na_names <- demo1$first_name_clean[is.na(demo1$gender)]
if(length(na_names) > 0){
  gender_genderize <- gender(na_names, method = "genderize")
  demo1$gender <- ifelse(is.na(demo1$gender),
                         gender_genderize$gender[match(demo1$first_name_clean, gender_genderize$name)],
                         demo1$gender)
}

# 标记剩余NA为unknown
demo1$gender <- replace(demo1$gender, is.na(demo1$gender), "unknown")

# 查看结果
print(demo1)

内容的提问来源于stack exchange,提问作者Fox_Summer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 16:37:26