首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Tidyverse:根据部分匹配替换整个字符串

Tidyverse:根据部分匹配替换整个字符串
EN

Stack Overflow用户
提问于 2019-05-22 04:42:53
回答 2查看 0关注 0票数 0

我正在寻找使用stringr包中的函数基于部分匹配替换数据中的整个字符串条目。

我尝试过的唯一方法是使用替换精确匹配,str_replace_all()但是当有许多变量需要纠正时,这会变得单调乏味。我正在寻找基于部分匹配的替换。在我的下面的代表中,我通过直接规范替换“西班牙人”和“哥伦比亚人”的变体。但是,我很乐意根据满足条件中“Spa”或“Col”存在的条件来执行这些替换。

library(tidyverse)
library(stringr)

data <- c(
  "Spanish",
  "SPANIARD",
  "Spainiard",
  "Colombian",
  "Columbian",
  "Ecuador",
  "Equador",
  "Ecuadorian",
  "VENEZUELAN"
)

str_replace_all(data,
                c(
                  "Spanish" = "Spaniard",
                  "SPANIARD" = "Spaniard",
                  "Spainiard" = "Spaniard",
                  "Columbian" = "Colombian"
                ))
#> [1] "Spaniard"   "Spaniard"   "Spaniard"   "Colombian"  "Colombian" 
#> [6] "Ecuador"    "Equador"    "Ecuadorian" "VENEZUELAN"

reprex包创建于2019-05-21 (v0.2.1)

所以str_replace_all()像宣传的那样工作,但我正在寻找一种简化tidyverse中这个过程的方法。任何帮助深表感谢。

EN

回答 2

Stack Overflow用户

发布于 2019-05-22 13:04:46

我更喜欢使用距离测量(例如,Jaro-winkler的距离,或其他一些距离测量),但它们确实有它们的缺点。厌倦了你可以用部分匹配改变的东西。如果你正在进行部分匹配,那么了解可能性是明智的。但是,你可以做你所概述tidyverse使用case_when带有startsWithgrepl

tibble(data = data) %>%
  mutate(
    v1 = tolower(data),
    new_name = case_when(
      startsWith(v1, "spa") ~ "Spanaird",
      startsWith(v1, "col") ~ "Colombian",
      startsWith(v1, "eq") | startsWith(v1, "ec") ~ "Equadorian",
      startsWith(v1, "ven") ~ "Venezuelan",
      TRUE ~ as.character(data)))

# A tibble: 9 x 3
  data       v1         new_name  
  <chr>      <chr>      <chr>     
1 Spanish    spanish    Spanaird  
2 SPANIARD   spaniard   Spanaird  
3 Spainiard  spainiard  Spanaird  
4 Colombian  colombian  Colombian 
5 Columbian  columbian  Colombian 
6 Ecuador    ecuador    Equadorian
7 Equador    equador    Equadorian
8 Ecuadorian ecuadorian Equadorian
9 VENEZUELAN venezuelan Venezuelan

要看到可以做到这一点的可能性(或其他一些事情):

tibble(data = data) %>%
  arrange(data) %>%
  count(tolower(data)) 
票数 0
EN

Stack Overflow用户

发布于 2019-05-22 14:31:15

一种选择是使用距离方法进行部分匹配

vals <- c("Spaniard", "Equador", "Colombian", "Venezuelan")
library(stringdist)
vals[amatch(tolower(data), tolower(vals),maxDist=5)]
#[1] "Spaniard"   "Spaniard"   "Spaniard"   "Colombian"  "Colombian"  
#[6] "Equador"    "Equador"    "Equador"    "Venezuelan"

它可以在tidyverse工作流程中进行管道传输

library(tidyverse)
tibble(v1 = data) %>%
    mutate(v1 = vals[amatch(tolower(v1), tolower(vals), maxDist = 5)])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100009048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档