如何解决gsub多种替换和一种模式
我有很多西班牙语名字。其中有些具有我要处理的特殊字符(重音符号)。每次带有重音时,我都会使用字符“-+”。没有办法知道替换是“á”还是“é”或“í”或“ó”或“ú”或“ñ”,而只能查看每个名称。
我有这样的东西:
df <- data.frame(name = c('adri-+n','in-+s','mar-+a','-+scar','l-+cio','juli-+n','jos-+','sof-+a','crist-+bal','yajn-+'))
我知道带有名字的口音:
c('adrián','inés','maría','óscar','lúcio','julián','josé','sofía','cristóbal','yajnú')
我想要获得的是带有正确字母且没有重音的校正后的数据帧。像这样:
cdf <- data.frame(name = c('adrian','ines','maria','oscar','lucio','julian','jose','sofia','cristobal','yajnu'))
我已经根据每个名称构建了一个带有适当替换的变量(请注意转义字符'\ +'):
a <- 'adri-\\+n|juli-\\+n'
e <- 'in-\\+s|jos-'
i <- 'mar-\\+a|sof-\\+a'
o <- '-\\+scar|crist-\\+bal'
u <- 'l-\\+cio|yajn-\\+'
cdf <- df %>%
mutate(a=ifelse(str_detect(name,a),'a',''),e=ifelse(str_detect(name,e),'e',i=ifelse(str_detect(name,i),'i',o=ifelse(str_detect(name,o),'o',u=ifelse(str_detect(name,u),'u',lett = str_c(a,e,i,o,u)) %>%
mutate(name = gsub('-\\+',lett,name))
但是最后一个mutate(name = gsub('-\\+',name))
无效,因为我无法使用字符列lett
来获取多个替换。实际上,我收到了一条警告消息:
Warning messages:
1: Problem with `mutate()` input `name`.
i argument 'replacement' has length > 1 and only the first element will be used
i Input `name` is `gsub("-\\+",name)`.
2: In gsub("-\\+",name) :
argument 'replacement' has length > 1 and only the first element will be used
和不希望的结果:
> cdf
name a e i o u lett
1 adrian a a
2 inas e e
3 maraa i i
4 ascar o o
5 lacio u u
6 julian a a
7 josa e e
8 sofaa i i
9 cristabal o o
10 yajna u u
我也尝试过 mgsub 包,但是(据我所知)它仅适用于矢量到矢量的替换(多个到多个),而不是一个模式和多个替换。
如何获得所需的结果?
> cdf
name a e i o u lett
1 adrian a a
2 ines e e
3 maria i i
4 oscar o o
5 lucio u u
6 julian a a
7 jose e e
8 sofia i i
9 cristobal o o
10 yajnu u u
谢谢!
编辑:
我终于找到了mutate( name = unlist(Map(gsub,pattern = '-\\+',replacement = lett,name)) )
所需的解决方案:
cdf <- df %>%
mutate(a=ifelse(str_detect(name,u)) %>%
mutate(name = unlist(Map(gsub,name)) )
> cdf
name a e i o u lett
1 adrian a a
2 ines e e
3 maria i i
4 oscar o o
5 lucio u u
6 julian a a
7 jose e e
8 sofia i i
9 cristobal o o
10 yajnu u u
解决方法
有一个apply
系列功能可以满足您的需求,请查看mapply
。
它不适合dplyr管道,因此请创建一个临时表然后使用它:
df2 <- cdf %>%
mutate(a=ifelse(str_detect(name,a),'a',''),e=ifelse(str_detect(name,e),'e',i=ifelse(str_detect(name,i),'i',o=ifelse(str_detect(name,o),'o',u=ifelse(str_detect(name,u),'u',lett = str_c(a,e,i,o,u))
with(df2,mapply(function(x,y) gsub('-\\+',x,y),lett,name))
这与问题R gsub remove words in column y from words in column x非常相似。为了帮助其他人搜索这些类型的问题,我们可以将其标记为重复(不是对您的打击)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。