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
相关产品推荐
相关产品推荐

