str_replace 和 gsub 之间的不同行为

Different behaviour between str_replace and gsub

我注意到 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(如sub)仅删除第一次出现,如果您需要删除所有出现的事件,您可以使用str_replace_all(如gsub)。

library(dplyr)
library(stringr)

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

或者使用 @csgroen 提到的 str_remove_all,shorthand 代表 str_replace_allreplacement 代表 ""

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