如何在R中利用数据框实现str_replace_all批量文本替换?
从数据框生成替换规则实现批量字符串替换
问题背景
原本通过手动编写命名向量,使用str_replace_all处理dog_descriptions数据框的breed_primary字段:
dog_descriptions <- data.frame(breed_primary = c("Pit Bull Terrier", "Labrador Retriever", "Border Collie"), number_of_legs = rep(4, 3)) dog_descriptions2 <- dog_descriptions %>% mutate(breed_primary2 = str_replace_all(breed_primary, c("Pit Bull Terrier" = "Pit Bull\nTerrier", "Labrador Retriever" = "Labrador\nRetriever", "Border Collie" = "Border\nCollie")))
现在希望改用replacement_input数据框(已定义原字符串和目标替换字符串)来实现批量替换,避免手动编写长替换向量:
replacement_input <- data.frame(replace = c("Pit Bull Terrier", "Labrador Retriever", "Border Collie", "Fourth Entry"), replace_with = c("Pit Bull\nTerrier", "Labrador\nRetriever", "Border\nCollie", "Replace 4th"))
解决方案
方法1:使用tidyr::deframe转换数据框为命名向量
deframe函数可以直接将两列数据框转换为名称=原字符串,值=目标字符串的命名向量,完美匹配str_replace_all的替换规则要求:
library(dplyr) library(stringr) library(tidyr) # 将数据框转换为命名替换向量 replace_vector <- deframe(replacement_input) # 执行批量替换 dog_descriptions2 <- dog_descriptions %>% mutate(breed_primary2 = str_replace_all(breed_primary, replace_vector))
方法2:基础R的setNames构造命名向量
如果不想加载tidyr包,可以用基础R的setNames函数手动构造命名向量:
library(dplyr) library(stringr) # 构造命名替换向量 replace_vector <- setNames(replacement_input$replace_with, replacement_input$replace) # 执行批量替换 dog_descriptions2 <- dog_descriptions %>% mutate(breed_primary2 = str_replace_all(breed_primary, replace_vector))
说明
- 两种方法都会自动将
replacement_input中的所有替换规则转换为符合要求的向量,无需手动逐个编写 str_replace_all会按向量中的顺序匹配替换,若存在字符串重叠的情况,需注意调整replacement_input的行顺序(优先匹配长字符串)
内容的提问来源于stack exchange,提问作者jpm
相关产品推荐
相关产品推荐

