将所有包含 ′ 的变量突变为 '?和其他符号到想要的一个?

问题描述 投票:0回答:1

如何使用 R 将所有包含 ′ 的变量突变为 '?

df <- data.frame(
S=c("1′,@","2′2′abc","3:ae′","′4~@e′","55′","6:ae′"),
Q=c("AAA′E","BEAA′","CA′′B","D:DDF","EE@′A","FFSS")
)
        S     Q
1    1′,@ AAA′E
2 2′2′abc BEAA′
3   3:ae′ CA′′B
4  ′4~@e′ D:DDF
5     55′ EE@′A
6   6:ae′  FFSS

所需输出:

        S     Q
1    1',@ AAA'E
2 2'2'abc BEAA'
3   3:ae' CA''B
4  ′4~@e' D:DDF
5     55' EE@'A
6   6:ae'  FFSS

这是我尝试过的:

library(tidyverse)
library(dplyr)

df %>%
  mutate(
    dplyr::across(
      .cols = everything(), 
      .fns = ~ dplyr::if_else(stringr::str_detect(.x, "′"), "'", .x)
    )
  )

返回

   S     Q
1 '     '
2 '     '
3 '     '
4 ' D:DDF
5 '     '
6 '  FFSS

有人可以建议如何更改语法以使其工作吗?

如果解决方案扩展到也能变异,那将非常有帮助

: to ^

@ in df$S to a

AA to aa

因为它将适用于我能想到的大多数情况。

提前致谢。

r dplyr replace
1个回答
2
投票

您应该使用

gsub
stringr::str_replace_all
而不是
ifelse

library(dplyr)

df %>%
  mutate(across(everything(), ~ gsub("′", "'", .x)))

#         S     Q
# 1    1',@ AAA'E
# 2 2'2'abc BEAA'
# 3   3:ae' CA''B
# 4  '4~@e' D:DDF
# 5     55' EE@'A
# 6   6:ae'  FFSS

要在每个字符串中执行多次替换,您可以将命名向量

c(pattern1 = replacement1)
传递给
str_replace_all

df %>%
  mutate(
    S = str_replace_all(S, "@", "a"),
    across(everything(), ~ str_replace_all(.x, c("′" = "'", ":" = "\\^", "AA" = "aa")))
  )

#         S     Q
# 1    1',a aaA'E
# 2 2'2'abc BEaa'
# 3   3^ae' CA''B
# 4  '4~ae' D^DDF
# 5     55' EE@'A
# 6   6^ae'  FFSS
© www.soinside.com 2019 - 2024. All rights reserved.