You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:如何仅替换向量元素的首位数字而保留个位数字?

解决方案

你的问题核心是要只替换数字的首位(十位),保留个位,原来的str_replace_all会替换所有匹配的数字,所以不符合需求。这里给你两种简便的实现方式:

方法一:数学拆分法(高效直观)

因为向量里都是两位数,直接通过数学运算拆分十位和个位,再映射拼接:

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)

# 定义数字到文本的映射
num_map <- c('3' = 'Air', '4' = 'Car', '5' = 'Polluted', '6' = 'Gas')

# 提取十位(转字符)和个位数字
tens_digit <- as.character(floor(vector / 10))
units_digit <- as.character(vector %% 10)

# 拼接成目标格式
result <- paste0(num_map[tens_digit], "_", units_digit)

print(result)

运行后输出:

#  [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"     

方法二:正则捕获法(灵活适配多位数)

如果后续向量里可能出现三位数以上,用正则捕获首位数字和剩余部分更灵活:

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)

num_map <- c('3' = 'Air', '4' = 'Car', '5' = 'Polluted', '6' = 'Gas')

# 用正则捕获首位数字和后面的部分,替换后拼接
result <- str_replace(vector, "^([3456])(.*)", function(match) {
  paste0(num_map[match[1]], "_", match[2])
})

print(result)

这个方法通过^([3456])(.*)匹配开头的3/4/5/6,以及后面所有字符(这里就是个位数字),再通过匿名函数完成映射拼接。

内容的提问来源于stack exchange,提问作者12666727b9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:05:17