替换R中包含+的字符串

dhxwm5r4  于 2022-12-25  发布在  其他
关注(0)|答案(5)|浏览(161)

我试图替换一个包含+的字符串,但是我使用的函数无法完成这个任务。

testdata <- data.frame(id = c(1,2,3),
                   v1 = c("A+B", "C","D"),
                   v2 = c("N","M","A+B"),
                   v3 = c("D","E","T"))

> testdata
  id  v1  v2 v3
1  1 A+B   N  D
2  2   C   M  E
3  3   D A+B  T

下面的函数没有任何作用。

testdata %>% 
  mutate_all(funs(str_replace(., "A+B", "")))

我想删除 Dataframe 中的任何位置的A+B
如何才能到达下面所需的数据集

> testdata
  id  v1  v2 v3
1  1  NA   N  D
2  2   C   M  E
3  3   D  NA  T
mhd8tkvw

mhd8tkvw1#

如果要替换固定字符串"A+B",请使用na_if

library(dplyr)
testdata <- testdata %>% 
     mutate(across(where(is.character), ~ na_if(.x,  "A+B")))
  • 输出
testdata
 id   v1   v2 v3
1  1 <NA>    N  D
2  2    C    M  E
3  3    D <NA>  T

或者如果我们要检查+符号

library(stringr)
testdata <- testdata %>%
   mutate(across(where(is.character),
     ~ case_when(str_detect(.x, fixed("+"), negate = TRUE) ~ .x)))
testdata
  id   v1   v2 v3
1  1 <NA>    N  D
2  2    C    M  E
3  3    D <NA>  T
vlju58qv

vlju58qv2#

你需要用\\来逃避+

library(dplyr)
library(stringr)

testdata |> 
  mutate(across(everything(), ~str_remove(., "A\\+B")))

#>   id v1 v2 v3
#> 1  1     N  D
#> 2  2  C  M  E
#> 3  3  D     T

创建于2022年12月20日,使用reprex v2.0.2

cclgggtu

cclgggtu3#

用于删除包含+的字符串的基本R选项为:

testdata[] <- lapply(testdata, \(x) ifelse(grepl("\\+", x), NA, x))

结果:

testdata
#>   id   v1   v2 v3
#> 1  1 <NA>    N  D
#> 2  2    C    M  E
#> 3  3    D <NA>  T
rqdpfwrv

rqdpfwrv4#

我认为问题是+被解释为正则表达式,所以你需要添加两个\\来转义那个字符。然后,你可以使用str_replace。哦,mutate_all已经被mutate(across(...))取代了。

library(dplyr)
library(stringr)

testdata %>% 
  mutate(across(everything(), ~ str_replace(.x, "A\\+B", replacement = NA_character_))) 

#  id   v1   v2 v3
#1  1 <NA>    N  D
#2  2    C    M  E
#3  3    D <NA>  T
wnavrhmk

wnavrhmk5#

搜索和替换给定短语的简单方法。

for(i in 2:length(testdata))
 {
   testdata[,i]<- ifelse(testdata[,i]=="A+B", NA ,testdata[,i])   
 }

相关问题