如何为每个科目生成唯一ID?应使用何种库及case_when()是否适用?
问题解答
原始数据
| Subject code | Name |
|---|---|
| 401 | John |
| 422 | Mary |
| 463 | Peter |
目标结果
| ID | Subject code | Name |
|---|---|---|
| S01 | 401 | John |
| S22 | 422 | Mary |
| S63 | 463 | Peter |
适用库
用R语言的话,tidyverse套件就足够,核心用到dplyr(数据处理)和stringr(字符串操作)两个包。
实现方法
完全不需要用case_when(),你的需求是统一规则的字符串提取与格式化,用字符串处理函数更高效直接:
- 先把
Subject code转成字符型,提取后两位; - 补前导零(确保单数字的情况也能得到两位格式,比如41变成01);
- 拼接前缀"S"生成最终ID。
示例代码:
library(tidyverse) # 构造原始数据框 df <- tibble( Subject_code = c(401, 422, 463), Name = c("John", "Mary", "Peter") ) # 生成ID列 df <- df %>% mutate( # 方法1:用stringr系列函数 ID = str_c("S", str_pad(str_sub(as.character(Subject_code), -2), 2, side = "left", pad = "0")), # 方法2:用sprintf格式化(更简洁) # ID = sprintf("S%02d", as.integer(str_sub(as.character(Subject_code), -2))) )
关于case_when()的适用性
case_when()是用来处理多条件分支场景的,比如不同区间的Subject code要对应不同的ID生成规则。但你的需求是所有行都遵循同一规则,用它反而会把简单问题搞复杂——你得给每个Subject code单独写分支,完全没必要。只有后续ID规则出现差异化分支时,才需要考虑用它。
内容的提问来源于stack exchange,提问作者oohsehun
相关产品推荐
相关产品推荐

