【问题标题】:change numbers in string vector [duplicate]更改字符串向量中的数字[重复]
【发布时间】:2019-09-03 14:18:57
【问题描述】:

我有一个字符串向量,包括这样的数字:

x <- c("abc122", "73dj", "lo7833ll")

x
[1] "abc122"   "73dj"     "lo7833ll"

我想更改 x Vector 的数字并将其替换为我存储在另一个 Vector 中的数字:

right_numbers <- c(500, 700, 23)
> right_numbers
[1] 500 700  23

即使数字在字符串中的不同位置(有些在开头,有些在结尾..),我该怎么做?

这是 x 向量在更改后的样子:

> x
[1] "abc500"   "700dj"     "lo23ll"

【问题讨论】:

  • sapply(seq_along(x), function(i) {sub("[0-9]+", right_numbers[i], x[i])})
  • 一些相关的和可能有用的想法here, here, here

标签: r


【解决方案1】:

stringr 的矢量化解决方案 -

str_replace(x, "[0-9]+", as.character(right_numbers))

[1] "abc500" "700dj"  "lo23ll"

感谢@sindri_baldur,可能是带有stringi 包的更高效版本-

stri_replace_first_regex(x, '[0-9]+', right_numbers)

[1] "abc500" "700dj"  "lo23ll"

【讨论】:

  • 或者直接使用(更高效)stringi:stri_replace_first_regex(x, '[0-9]+', right_numbers)
  • @sindri_baldur 谢谢!我不熟悉stringi 包,但我会用你的名字将其添加到答案中。
  • stringr 函数是 stringi 函数的更短更简单的包装器。
【解决方案2】:

这是一个想法,

mapply(function(i, y)gsub('[0-9]+', y, i), x, right_numbers)
#  abc122     73dj lo7833ll 
#"abc500"  "700dj" "lo23ll" 

【讨论】:

  • sub() 应该足够了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多