R语言中从Series ID提取对应stateid并生成新变量的方法
从seriesid中提取匹配预定义stateid的解决方案
问题场景
现有包含seriesid列的数据框,每个seriesid字符串的SMU后两位对应州ID(stateid);同时有一个存储所有合法stateid的向量,需将每个seriesid对应的stateid提取为数据框新列。
示例数据
df <- data.frame(seriesid = c("SMU01000002000000001", "SMU01000002000000001", "SMU02000002000000001", "SMU04000002000000001", "SMU04000002000000001", "SMU09000002000000001")) stateid <- c(1:2, 4:6, 8:13) stateid[stateid<10] <- paste0('0', stateid[stateid<10])
实现方案
方法1:直接提取固定位置子串(高效简洁)
由于stateid固定在SMU后的两位(字符串第4-5位,R语言字符串索引从1开始),直接用substr()函数提取:
df$stateid <- substr(df$seriesid, start = 4, stop = 5)
执行后结果如下:
> df seriesid stateid 1 SMU01000002000000001 01 2 SMU01000002000000001 01 3 SMU02000002000000001 02 4 SMU04000002000000001 04 5 SMU04000002000000001 04 6 SMU09000002000000001 09
方法2:匹配预定义stateid向量(合法性校验)
如果需要确保提取的stateid属于预定义的合法列表,可通过正则匹配实现:
# 生成匹配正则:匹配SMU后接合法stateid的模式 pattern <- paste0("SMU(", paste(stateid, collapse = "|"), ")") # 提取匹配到的stateid df$stateid <- sub(pattern, "\\1", df$seriesid)
该方法仅提取预定义stateid列表中的值,若seriesid中的stateid不在列表内,会保留原字符串(可根据需求调整异常处理逻辑)。
内容的提问来源于stack exchange,提问作者sstewart
相关产品推荐
相关产品推荐

