【问题标题】:Strange character behavior in str_replace_all when used with setNames与 setNames 一起使用时 str_replace_all 中的奇怪字符行为
【发布时间】:2026-01-28 13:30:01
【问题描述】:

我有一个数据集,其中年龄编码为值 1-9,我想交换定义,但是当我这样做时,一些名称被连接在一起。我认为它与我正在尝试做的定义中的“-”字符有关。我需要做什么才能使字符不会导致意外返回,因为在我尝试用包含“/”的定义替换代码的其他情况下也会发生这种情况。

简单示例

library(tidyverse)
df.1 <- data.frame(age = round(runif(n = 50, 1, 9),0))
age.pattern <- as.data.frame(cbind(value = 1:9, key = c("0-2",
                                                        "3-9",
                                                        "10-19",
                                                        "20-39",
                                                        "40-59",
                                                        "60-64",
                                                        "65-74",
                                                        "75-84",
                                                        "85+")),
                             stringsAsFactors = F)

df.2 <- df.1 %>%
  mutate(patient_age = str_replace_all(age,
                                setNames(age.pattern$key,
                                         age.pattern$value)))
unique(df.2$patient_age)
[1] "75-84"         "20-385+"       "10-185+"      
[4] "10-185+-85+"   "60-64"         "65-74"        
[7] "0-10-185+-85+" "85+"           "40-585+"      

【问题讨论】:

  • 我认为您的意思是 fixedregex 案例?默认情况下,它使用正则表达式模式,在正则表达式中,- 用于范围
  • @akrun 我更新了问题以包含我看到的输出
  • 你可以使用base R setNames(age.pattern$key, age.pattern$value)[as.character(head(df.1$age))]
  • @akrun 是的,我想这会奏效

标签: r dplyr stringr


【解决方案1】:

str_replace_all 可能存在与regex 模式相关的问题。一个更简单的选择是 base R 使用命名向量进行匹配和替换

df.1$patient_age <- setNames(age.pattern$key, 
                         age.pattern$value)[as.character(df.1$age)]

【讨论】:

    【解决方案2】:

    由于您想在这里进行完全匹配,我们可以使用match

    head(df.1$age, 10)
    #[1] 6 3 7 1 4 9 8 3 5 4
    
    head(age.pattern$key[match(df.1$age, age.pattern$value)], 10)
    #[1] "60-64" "10-19" "65-74" "0-2" "20-39" "85+" "75-84" "10-19" "40-59" "20-39"
    

    【讨论】: