在R语言中判断字符串指定位置数字并生成新变量
解决根据字符串第7位生成新变量的问题
需求说明
针对包含9位数字字符串列Vectest的dataframe,生成新变量variable2:
- 当
Vectest第7位为1时,variable2赋值为1 - 当第7位为
2时,赋值为5 - 当第7位为
3时,赋值为6 - 其他情况赋值为
NA
示例数据与解决方案
方法1:使用grepl结合嵌套ifelse
按照你提到的grepl思路,通过正则表达式匹配第7位字符,结合ifelse完成赋值:
library(tidyverse) # 构造示例数据 ID <- c(1,2,3,4,5,6) Vectest <- c("830008100", "830056123", "830678309", "830008100", "830056123", "830678309") data <- data.frame(ID, Vectest) # 生成新变量 data <- data %>% mutate(variable2 = ifelse(grepl("^.{6}1", Vectest), 1, ifelse(grepl("^.{6}2", Vectest), 5, ifelse(grepl("^.{6}3", Vectest), 6, NA))))
正则说明:^.{6}1表示从字符串开头起,匹配任意6个字符后紧跟1,即第7位为1;同理^.{6}2、^.{6}3分别匹配第7位为2、3的情况。
方法2:提取第7位后用case_when(更易读)
先通过substr直接提取第7位字符,再用case_when替代嵌套ifelse,代码可读性更强:
data <- data %>% mutate( # 提取第7位字符 seventh_digit = substr(Vectest, 7, 7), # 按规则赋值 variable2 = case_when( seventh_digit == "1" ~ 1, seventh_digit == "2" ~ 5, seventh_digit == "3" ~ 6, # 其他情况返回NA TRUE ~ NA_real_ ) ) %>% # 可选:删除中间生成的seventh_digit列 select(-seventh_digit)
内容的提问来源于stack exchange,提问作者Patrick Parts
相关产品推荐
相关产品推荐

