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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:43:20