如何在含变量的字符串中添加指定范围的前缀字符串(R语言)
问题:循环为ID添加A1:A5、B1:B5格式的前缀
示例数据集
id <- c("aaa1", "aaa1", "bbb1", "aaa2", "b1","a3", "a1", "b1", "a1", "b1" ) data <- data.frame(id) # 数据集预览 # id # 1 aaa1 # 2 aaa1 # 3 bbb1 # 4 aaa2 # 5 b1 # 6 a3 # 7 a1 # 8 b1 # 9 a1 # 10 b1
当前实现代码
现有代码仅能按ID变化生成连续的A前缀序号,无法实现每5个循环切换字母:
library(dplyr) data_df <- data %>% mutate(id = paste0("A", cumsum(id != lag(id, default = first(id))) + 1,".", id)) # 当前输出 # id # 1 A1.aaa1 # 2 A1.aaa1 # 3 A2.bbb1 # 4 A3.aaa2 # 5 A4.b1 # 6 A5.a3 # 7 A6.a1 # 8 A7.b1 # 9 A8.a1 # 10 A9.b1
期望输出
需要按行顺序每5个条目循环使用A1-A5、B1-B5这类前缀:
# id # 1 A1.aaa1 # 2 A2.aaa1 # 3 A3.bbb1 # 4 A4.aaa2 # 5 A5.b1 # 6 B1.a3 # 7 B2.a1 # 8 B3.b1 # 9 B4.a1 # 10 B5.b1
解决方案
Tidyverse 实现
利用行号计算分组和组内序号,结合LETTERS向量生成对应字母前缀:
library(dplyr) library(glue) data_df <- data %>% mutate( # 计算字母分组(每5行一组) letter_group = (row_number() - 1) %/% 5 + 1, # 计算组内序号(1-5循环) seq_in_group = (row_number() - 1) %% 5 + 1, # 拼接前缀与原ID id = glue("{LETTERS[letter_group]}{seq_in_group}.{id}") ) %>% # 移除中间计算列 select(-letter_group, -seq_in_group)
基础R 实现
无需额外包,直接通过行号计算生成前缀:
# 获取行号 row_nums <- seq_len(nrow(data)) # 计算字母分组 letter_group <- (row_nums - 1) %/% 5 + 1 # 计算组内序号 seq_in_group <- (row_nums - 1) %% 5 + 1 # 拼接前缀与原ID data$id <- paste0(LETTERS[letter_group], seq_in_group, ".", data$id)
两种方法均可得到符合要求的输出,核心逻辑是通过行号的整除和取余运算,实现每5行切换一次字母、组内序号1-5循环的效果。
内容的提问来源于stack exchange,提问作者choij
相关产品推荐
相关产品推荐

