我正在寻找使用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中这个过程的方法。任何帮助深表感谢。
发布于 2019-05-22 13:04:46
我更喜欢使用距离测量(例如,Jaro-winkler的距离,或其他一些距离测量),但它们确实有它们的缺点。厌倦了你可以用部分匹配改变的东西。如果你正在进行部分匹配,那么了解可能性是明智的。但是,你可以做你所概述tidyverse使用case_when
带有startsWith
或grepl
:
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))
发布于 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)])
https://stackoverflow.com/questions/-100009048
复制相似问题