【问题标题】:Different behaviour between str_replace and gsub [duplicate]str_replace 和 gsub 之间的不同行为 [重复]
【发布时间】:2020-07-17 08:18:14
【问题描述】:

我注意到stringr::str_replacegsub 之间的行为不同。

样本数据:

dat <- structure(list(country_name = c("Burkina", "Burkina", "Burkina", 
"Burkina", "Burkina", "Burkina"), region_name = c("BOUCLE DU MOUHOUN_NA", 
"BOUCLE DU MOUHOUN_NA", "BOUCLE DU MOUHOUN_NA", "BOUCLE DU MOUHOUN_NA", 
"BOUCLE DU MOUHOUN_NA", "BOUCLE DU MOUHOUN_NA"), lat = c("NA_NA", 
"NA_NA", "NA_NA", "NA_NA", "NA_NA", "NA_NA"), lon = c("NA_NA", 
"NA_NA", "NA_NA", "NA_NA", "NA_NA", "NA_NA"), farm_size_ha = c("3_NA", 
"5.67_NA", "8_NA", "46_NA", "29.5_NA", "20_NA"), plot_number = c("4_NA_NA", 
"5_NA_NA", "3_NA_NA", "3_NA_NA", "9_NA_NA", "5_NA_NA")), row.names = c(NA, 
6L), class = "data.frame")

使用str_replace

dat %>%   mutate_all(~str_replace(., pattern = 'NA_|_NA', replacement = '')) 

给予:

   country_name       region_name lat lon farm_size_ha plot_number 
 Burkina BOUCLE DU MOUHOUN  NA  NA            3        4_NA    
 Burkina BOUCLE DU MOUHOUN  NA  NA         5.67        5_NA    
 Burkina BOUCLE DU MOUHOUN  NA  NA            8        3_NA  
 Burkina BOUCLE DU MOUHOUN  NA  NA           46        3_NA   
 Burkina BOUCLE DU MOUHOUN  NA  NA         29.5        9_NA   
 Burkina BOUCLE DU MOUHOUN  NA  NA           20        5_NA

使用gsub

dat %>%  mutate_all(~gsub(pattern = 'NA_|_NA', replacement = '', .)) 

给出所需的输出:

country_name       region_name lat lon farm_size_ha plot_number
Burkina BOUCLE DU MOUHOUN  NA  NA            3           4
Burkina BOUCLE DU MOUHOUN  NA  NA         5.67           5
Burkina BOUCLE DU MOUHOUN  NA  NA            8           3
Burkina BOUCLE DU MOUHOUN  NA  NA           46           3
Burkina BOUCLE DU MOUHOUN  NA  NA         29.5           9
Burkina BOUCLE DU MOUHOUN  NA  NA           20           5

你能解释一下为什么他们的行为不同吗?以及如何强制str_replace 表现得像gsub

【问题讨论】:

  • 使用str_replace_all
  • 或者更好的是,使用str_remove

标签: r str-replace gsub


【解决方案1】:

str_replace(如sub)仅删除第一次出现,如果您需要删除所有出现,您可以使用str_replace_all(如gsub)。

library(dplyr)
library(stringr)

dat %>% mutate(across(.fns = ~str_replace_all(., pattern = 'NA_|_NA', replacement = ''))) 

或者使用@csgroen 提到的str_remove_all,它是str_replace_all 的简写,replacement""

dat %>% mutate(across(.fns = ~str_remove_all(., pattern = 'NA_|_NA'))) 


#  country_name       region_name lat lon farm_size_ha plot_number
#1      Burkina BOUCLE DU MOUHOUN  NA  NA            3           4
#2      Burkina BOUCLE DU MOUHOUN  NA  NA         5.67           5
#3      Burkina BOUCLE DU MOUHOUN  NA  NA            8           3
#4      Burkina BOUCLE DU MOUHOUN  NA  NA           46           3
#5      Burkina BOUCLE DU MOUHOUN  NA  NA         29.5           9
#6      Burkina BOUCLE DU MOUHOUN  NA  NA           20           5

【讨论】:

  • 非常感谢,我不知道 str_replace 的 _all 后缀,也不知道 str_remove。很高兴知道! (我真的没有得到反对票)
猜你喜欢
  • 2020-07-23
  • 2013-09-02
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2014-11-01
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多