如何在R中批量调用Name-Prism API为数据框添加种族得分列
批量调用Name-Prism API获取种族得分的R解决方案
步骤1:加载所需R包
先安装并加载必要工具包:
install.packages(c("httr", "dplyr", "purrr", "readr")) library(httr) library(dplyr) library(purrr) library(readr)
步骤2:准备你的数据
假设你的数据框名为name_df,包含Name列:
# 示例数据框(替换为你的实际数据) name_df <- data.frame( Name = c("Barack Obama", "Xijin Ping", "Bladimir Putin", "John Smith") )
步骤3:定义API调用函数
编写函数处理单个姓名的请求,解析返回结果并提取最高种族得分(可根据需求修改为提取特定种族得分):
get_ethnicity_score <- function(name, api_token) { # URL编码姓名,处理空格等特殊字符 encoded_name <- URLencode(name, reserved = TRUE) # 构造API请求地址 api_url <- paste0("http://www.name-prism.com/api_token/nat/csv/", api_token, "/", encoded_name) # 发送请求并处理错误 tryCatch({ response <- GET(api_url) # 检查请求是否成功 stop_for_status(response) # 解析返回的CSV数据 result_csv <- read_csv(content(response, as = "text"), show_col_types = FALSE) # 提取最高得分(请根据API实际返回的列名调整,比如得分列可能叫score) max_score <- max(result_csv$score, na.rm = TRUE) return(max_score) }, error = function(e) { # 请求失败时返回NA并提示错误 message(paste("处理", name, "时出错:", e$message)) return(NA) }) }
步骤4:批量处理姓名并添加得分列
用purrr批量处理所有姓名,必须添加延迟避免API限流(Name-Prism对请求频率有限制,这里设置1秒间隔,可按需调整):
# 替换为你的API令牌 API_TOKEN <- "your_api_token_here" # 批量获取得分并添加到原数据框 name_df$Ethnicity_Score <- map_dbl(name_df$Name, ~{ Sys.sleep(1) # 每次请求间隔1秒 get_ethnicity_score(.x, API_TOKEN) })
最终结果
处理完成后,数据框会新增Ethnicity_Score列,格式如下:
Name Ethnicity_Score 1 Barack Obama 0.781 2 Xijin Ping 0.812 3 Bladimir Putin 0.912 4 John Smith 0.777
注意事项
- API限流:请求量较大时,建议延长间隔时间,避免被封禁IP。
- 错误处理:函数内置
tryCatch,请求失败的姓名会返回NA,可后续筛选重试。 - 列名适配:请根据API实际返回的CSV列名调整代码中的列名(比如得分列若不是
score,需对应修改)。
内容的提问来源于stack exchange,提问作者user12157566
相关产品推荐
相关产品推荐

