在许多列上使用 dplyr + gsub

Posted

技术标签:

【中文标题】在许多列上使用 dplyr + gsub【英文标题】:Using dplyr + gsub on many columns 【发布时间】:2017-09-13 09:05:12 【问题描述】:

我正在使用 dplyrgsub 删除特殊字符。我正在尝试翻译我使用 base R 的代码。

这是一个与我的数据相似的假示例:

region = c("regi\xf3n de tarapac\xe1","regi\xf3n de tarapac\xe1")
provincia = c("cami\xf1a","iquique")
comuna = c("tamarugal","alto hospicio")

comunas = cbind(region,provincia,comuna)

这对我有用:

comunas = comunas %>% 
  mutate(comuna = gsub("\xe1", "\u00e1", comuna), # a with acute
         comuna = gsub("<e1>", "\u00e1", comuna) # a with acute
  )

但现在我想对每一列都应用相同的内容:

comunas = comunas %>% 
  mutate_all(funs(gsub("\xe1", "\u00e1", .), # a with acute
         gsub("<e1>", "\u00e1", .) # a with acute
  ))

我看到最后一个块没有效果。这个想法是获得:

     region                     provincia   comuna         
[1,] "regi\xf3n de tarapacá" "cami\xf1a" "tamarugal"    
[2,] "regi\xf3n de tarapacá" "iquique"   "alto hospicio"

以及任何其他需要的更改。

有什么想法吗?非常感谢!

【问题讨论】:

请提供一个可重现的例子。我们无权访问 comunas_casen_2015。 ***.com/questions/5963269/… 它太重了......但我会插入它 我最好加个假的例子 做一个可重复的小例子。它不必包括你所拥有的一切。 comuna 没有改变。有什么要改变的吗?同时提供您期望的结果。 【参考方案1】:

2021 年更新

mutate_all 现在替换为 across。以下是在dplyr 的帮助下跨多个列使用gsub 的两种方法:

library(dplyr)

#Without anonymous function
comunas_casen_2015 %>%
  mutate(across(everything(), gsub, pattern = "\xe1|<e1>", replacement = "\u00e1"))

#With anonymous function
comunas_casen_2015 %>%
  mutate(across(everything(),~ gsub("\xe1|<e1>","\u00e1", .)))

              region provincia        comuna
1 región de tarapacá    camiña     tamarugal
2 región de tarapacá   iquique alto hospicio

#data
region = c("regi\xf3n de tarapac\xe1","regi\xf3n de tarapac\xe1")
provincia = c("cami\xf1a","iquique")
comuna = c("tamarugal","alto hospicio")

原答案

这对我有用:

region = c("regi\xf3n de tarapac\xe1","regi\xf3n de tarapac\xe1")
provincia = c("cami\xf1a","iquique")
comuna = c("tamarugal","alto hospicio")

comunas_casen_2015 = data.frame(region,provincia,comuna,stringsAsFactors=FALSE)


comunas_casen_2015 %>%
  mutate(region = gsub("\xe1", "\u00e1", region), # a with acute
         region = gsub("<e1>", "\u00e1", region) # a with acute
  )
  
  
comunas_casen_2015 %>%
  mutate_all(funs(gsub("\xe1", "\u00e1", .), # a with acute
         gsub("<e1>", "\u00e1", .) # a with acute
  ))

              region provincia        comuna        region_gsub provincia_gsub   comuna_gsub
1 región de tarapacá    camiña     tamarugal región de tarapacá         camiña     tamarugal
2 región de tarapacá   iquique alto hospicio región de tarapacá        iquique alto hospicio

【讨论】:

希望最近有更新。 @ethantenison 'mutate_all' 已被 'dplyr' 取代,并替换为 'mutate' 和 'across'。我更新了我的答案

以上是关于在许多列上使用 dplyr + gsub的主要内容,如果未能解决你的问题,请参考以下文章

如何在行而不是列上应用dplyr的select(,starts_with())? [重复]

R dplyr:使用字符串函数重命名变量

如何在许多匹配项中使用 ruby​​ gsub Regexp?

dplyr inner_join 与字符列上的 NA

使用 dplyr 复制一列并为 R 中的新列添加前缀

使用 dplyr 进行多步预测并执行