如何在R中替换分类变量含'f'实例并统一性别编码?
问题描述
我是R语言新手,抱歉若该问题已有解答,但我未在网上找到解决方案。我有一份350名参与者填写的性别相关调查响应数据集,许多响应表述相同但拼写、大小写等存在差异。运行unique(df$variable)得到部分结果如下:
[1] Male Female [3] female Female/woman [5] Female F [7] female Woman [9] Cis female, she her Female cisgender [11] Female heterosexual I identify as a trans woman! [13] Demiboy Transwoman [15] My sex is female and my gender identity is nonbinary male [17] m woman [19] Woman Nonbinary [21] my gender doesn't exist Male/AMAB
我已尝试的操作:
我曾尝试对所有唯一值分类,使用mutate进行替换:
f <- c("Female/woman", "female", "Female cisgender", "Female", "Woman", "woman", "Women", "women", "f", "F" ) m <- c("male", "Cis Male", "Male", "m", "M", "ma,e=]]") gq <- c("genderqueer", "nonbinary", "genderfluid") df |> mutate(GenderNew = case_when( GenderSex %in% f ~ "F", GenderSex %in% m ~ "M", GenderSex %in% gq ~ "Q", )) -> df_new
但该操作导致GenderNew列出现大量NA值,使用grepl也未成功。
我的需求:将响应字符串中所有包含女性相关关键词的内容统一替换为"F";男性相关响应替换为"M",性别酷儿/非二元相关响应替换为"GQ";未匹配的响应保留原始内容,以便后续重新编码。
测试数据:
GenderSex <- c("Male", "Female", "female", "Female/woman", "Female", "F", "female", "Woman", "Cis female, she her", "Female cisgender", "Female heterosexual", "I identify as a trans woman!", "Demiboy", "Transwoman", "My sex is female and my gender identity is nonbinary", "male", "m", "woman", "Woman", "Nonbinary", "my gender doesn't exist", "Male/AMAB")
解决方案
之前的精确匹配(%in%)无法覆盖长文本类的响应,改用模糊匹配结合关键词检测就能解决问题。以下是基于tidyverse包的实现方案:
首先加载依赖包:
library(tidyverse)
然后通过case_when结合str_detect实现模糊匹配,同时忽略大小写差异:
# 构建测试数据集 df <- tibble(GenderSex) # 生成标准化后的性别列 df_new <- df |> mutate(GenderNew = case_when( # 匹配所有女性相关关键词,忽略大小写 str_detect(str_to_lower(GenderSex), regex("female|woman|f")) ~ "F", # 匹配所有男性相关关键词,忽略大小写 str_detect(str_to_lower(GenderSex), regex("male|m|amab")) ~ "M", # 匹配性别酷儿/非二元相关关键词,忽略大小写 str_detect(str_to_lower(GenderSex), regex("nonbinary|demiboy|transwoman|genderqueer|genderfluid")) ~ "GQ", # 未匹配的内容保留原始值 TRUE ~ GenderSex ))
代码说明
str_to_lower:把所有响应文本转为小写,消除大小写对匹配的影响str_detect:检测字符串中是否包含指定关键词regex():用|分隔多个匹配关键词,实现多条件模糊匹配TRUE ~ GenderSex:确保所有未匹配的响应保留原始内容,不会生成NA
运行后可通过print(df_new)查看标准化后的结果。
内容的提问来源于stack exchange,提问作者user29756984
相关产品推荐
相关产品推荐

