与 setNames 一起使用时 str_replace_all 中的奇怪字符行为

Strange character behavior in str_replace_all when used with setNames

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

简单示例

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+"      

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

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

既然你想在这里进行精确匹配,我们可以使用 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"