【问题标题】:How to `chartr` a "-" (or escaping ranges)?如何`chartr`一个“-”(或转义范围)?
【发布时间】:2017-06-20 04:09:03
【问题描述】:

在 R 中,可以使用chartr 将字符从一个更改为另一个,例如:

chartr("aor","u ^","Stackoverflow")
[1] "Stuck ve^fl w"

模式可以是范围(例如chartr("a-hwo","0-9","Stackoverflow")),但长度需要匹配。

但是如何替换"-"

> chartr("ab-;","1234","aaa bbb ccc --- ;")
Error in chartr("ab-;", "1234", "aaa bbb ccc --- ;") : 
  decreasing range specification ('b-;')

> chartr(";-ab","4312","aaa bbb ccc --- ;")
Error in chartr(";-ab", "4312", "aaa bbb ccc --- ;") : 
  'old' is longer than 'new'

> chartr("ab\-;","1234","aaa bbb ccc --- ;")
Error: '\-' is an unrecognized escape in character string starting ""ab\-"

> chartr("ab--;","1234","aaa bbb ccc --- ;")
Error in chartr("ab--;", "1234", "aaa bbb ccc --- ;") : 
  decreasing range specification ('b--')

我找到了一种解决方法 - 将 char 放在开头或结尾:

> chartr("ab;-","1243","aaa bbb ccc --- ;")
[1] "111 222 ccc 333 4"

但我使用它来随机替换字符,所以在我的模式中 "-" 可以在任何地方:

chartr(
    old = "-!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~ "
    ,new = "-!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~ " %>% strsplit("") %>% .[[1]] %>% sample %>% paste(collapse="")
    , x = "x@&*#--s"
) # this randomly is ok or throw error (about length or decreasing range)

有没有办法关闭范围/转义范围字符/等?

【问题讨论】:

  • 我不知道,但如果你愿意使用stringi::stri_trans_char("aaa bbb ccc --- ;", "ab-;","1234"),那么它可以工作。
  • @Jota 这是一个非常不错的选择。

标签: r string replace


【解决方案1】:

- 的 unicode 码位低于 a,因此报错

递减范围规范('b--')

因此,如果使用范围,则需要将其放在 a 之前

没有范围:

chartr("-;ab","1234","aaa bbb ccc --- ;")
# [1] "333 444 ccc 111 2"

您随后可以使用- 来表示一个范围(保持新旧的长度匹配

`chartr("-a-c;","12b34","aaa bbb ccc --- ;")
# [1] "222 bbb 333 111 4"

【讨论】:

  • 好的,但您指的是其中一个问题。我根本不想要范围。当你写长度需要匹配。我理解错误信息:)。
【解决方案2】:

如果你强制每个值都是一个从自身延伸到自身的范围,你可以这样做:

old <- ";-ab"
new <- "4312"

splcomb <- function(x) gsub("(.)", "\\1-\\1", x)

splcomb(old)
#[1] ";-;---a-ab-b"

chartr(splcomb(old), splcomb(new), "aaa bbb ccc --- ;")
#[1] "111 222 ccc 333 4"

【讨论】:

  • 不错的一个。似乎唯一需要的是在破折号之前:chartr("ab-b-;","1234","aaa bbb ccc --- ;")
猜你喜欢
  • 2013-04-15
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2012-01-24
  • 1970-01-01
相关资源
最近更新 更多