如何仅替换字符串的前导数字,其中这些字符也显示为单位

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

我有以下向量

vector <- c(31, 41, 51, 61, 32, 42, 52, 62, 33, 43, 53, 63,
            34, 44, 54, 64, 35, 45, 55, 65, 36, 46, 56, 66)

我只想替换前导数字,而不在发现该数字为单位数字时转换该数字

str_replace_all(vector, c('3' = 'Air', '4' = 'Car',
                          '5' = 'Polluted', '6' = 'Gas'))

所需的输出只是使用每个最后/单位数字作为标记,这意味着例如:

只要有

3(unit/digit)
,代码就应将其转换为:

'Air_(unit/digit)'

更清楚地为:

#  [1] "Air_1"      "Car_1"      "Polluted_1"
#  [4] "Gas_1"      "Air_2"      "Car_2"     
#  [7] "Polluted_2" "Gas_2"      "Air_3"     
# [10] "Car_3"      "Polluted_3" "Gas_3"     
# [13] "Air_4"      "Car_4"      "Polluted_4"
# [16] "Gas_4"      "Air_5"      "Car_5"     
# [19] "Polluted_5" "Gas_5"      "Air_6"     
# [22] "Car_6"      "Polluted_6" "Gas_6" 

您能建议任何快速的方法吗?谢谢

r regex string stringr
5个回答
2
投票

这是另一个解决方案:

str_replace_all(vector, c('^3' ='Air_', '^4'='Car_',
                           '^5' = 'Polluted_', '^6' = 'Gas_'))

1
投票

假设我们总是有 2 位数字,使用算术运算符

%%
获得第一个数字,使用
%/%
获得余数 - 第二个数字。然后根据需要粘贴所有内容:

paste(
  c('3' = 'Air', '4' = 'Car', '5' = 'Polluted', '6' = 'Gas')[
    as.character(vector %/% 10) ],
  vector %% 10, sep = "_")
#  [1] "Air_1"      "Car_1"      "Polluted_1"
#  [4] "Gas_1"      "Air_2"      "Car_2"     
#  [7] "Polluted_2" "Gas_2"      "Air_3"     
# [10] "Car_3"      "Polluted_3" "Gas_3"     
# [13] "Air_4"      "Car_4"      "Polluted_4"
# [16] "Gas_4"      "Air_5"      "Car_5"     
# [19] "Polluted_5" "Gas_5"      "Air_6"     
# [22] "Car_6"      "Polluted_6" "Gas_6" 

1
投票

您可能正在寻找更奇特的解决方案,但这就是您正在寻找的吗?

library("stringr")
vector <- c(31, 41, 51, 61, 32, 42, 52, 62, 33, 43, 53, 63, 34, 44, 54, 
            64, 35, 45, 55, 65, 36, 46, 56, 66)

paste0(
  str_replace_all(stringr::str_extract(vector, "[[:digit:]]"),
                  c('3' ='Air', '4'='Car',
                    '5' = 'Polluted', '6' = 'Gas')),
  "_(",
  str_extract(vector, "[[:digit:]]$"),
  ")"
)
#>  [1] "Air_(1)"      "Car_(1)"      "Polluted_(1)" "Gas_(1)"      "Air_(2)"     
#>  [6] "Car_(2)"      "Polluted_(2)" "Gas_(2)"      "Air_(3)"      "Car_(3)"     
#> [11] "Polluted_(3)" "Gas_(3)"      "Air_(4)"      "Car_(4)"      "Polluted_(4)"
#> [16] "Gas_(4)"      "Air_(5)"      "Car_(5)"      "Polluted_(5)" "Gas_(5)"     
#> [21] "Air_(6)"      "Car_(6)"      "Polluted_(6)" "Gas_(6)"

创建于 2023-07-17,使用 reprex v2.0.2

这假设总是有两位数字,第一个数字代表类别,第二个数字代表某种值。


1
投票

使用

stringr
,您可以向
str_replace()
提供一个函数来替换第一个数字的匹配。

library(stringr)

str_replace(vector, "^.",
  ~ c('3'= 'Air_', '4'= 'Car_', '5'= 'Polluted_', '6'= 'Gas_')[.x])

#  [1] "Air_1"      "Car_1"      "Polluted_1" "Gas_1"      "Air_2"      "Car_2"     
#  [7] "Polluted_2" "Gas_2"      "Air_3"      "Car_3"      "Polluted_3" "Gas_3"     
# [13] "Air_4"      "Car_4"      "Polluted_4" "Gas_4"      "Air_5"      "Car_5"     
# [19] "Polluted_5" "Gas_5"      "Air_6"      "Car_6"      "Polluted_6" "Gas_6"

0
投票

尝试像这样

paste0

> paste0(c("Air", "Car", "Polluted", "Gas")[vector %/% 10 - 2], "_", vector %% 10)
 [1] "Air_1"      "Car_1"      "Polluted_1" "Gas_1"      "Air_2"
 [6] "Car_2"      "Polluted_2" "Gas_2"      "Air_3"      "Car_3"
[11] "Polluted_3" "Gas_3"      "Air_4"      "Car_4"      "Polluted_4"
[16] "Gas_4"      "Air_5"      "Car_5"      "Polluted_5" "Gas_5"
[21] "Air_6"      "Car_6"      "Polluted_6" "Gas_6"
© www.soinside.com 2019 - 2024. All rights reserved.