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

如何在含变量的字符串中添加指定范围的前缀字符串(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:30:55