微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gsub多种替换和一种模式

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?