R语言中如何拆分数字为单个数位并提取指定位置数值
两位数值变量提取末位的实现方法
你之前调用separate()未生效的核心原因有两个:
separate()是tidyr包的函数,不属于dplyr,未加载tidyr时直接调用会报错- 函数默认以非字母数字的特殊符号作为拆分分隔符,你的
socioEcon字段是连续两位纯数值、无内置分隔符,不指定拆分位置参数的话无法自动切分
18000行的数据量用以下任意方法都可以快速完成处理,无需手动操作:
方案1:适配tidyverse工作流的写法(和你现有管道操作代码兼容最好)
- 修正
separate()参数实现拆分
传入sep参数指定按字符位置拆分,两位数字在第1位后切分即可,convert = TRUE参数会自动把拆分后的结果转为数值型,避免后续计算出类型问题:library(dplyr) library(tidyr) demog <- demog %>% separate( col = socioEcon, into = c("first_digit", "second_digit"), sep = 1, convert = TRUE ) - 纯数值运算取余法(运行速度最快)
不需要做字符串处理,直接对数值做模10运算即可得到个位(也就是你要的第二位数字),不会出现字符串编码、格式兼容问题:library(dplyr) demog <- demog %>% mutate(second_digit = socioEcon %% 10) - 字符串位置提取法(灵活度最高)
如果后续需要提取其他位置的字符,用str_sub()按位置截取更方便:library(dplyr) library(stringr) demog <- demog %>% mutate(second_digit = as.integer(str_sub(socioEcon, start = 2, end = 2)))
方案2:基础R写法(无需加载额外第三方包)
不需要依赖tidyverse系列包,直接用基础函数即可实现:
# 数值取余法 demog$second_digit <- demog$socioEcon %% 10 # 字符串截取法 demog$second_digit <- as.integer(substr(as.character(demog$socioEcon), 2, 2))
校验提示:跑完代码后可以运行
table(demog$second_digit, useNA = "ifany")快速核对结果,确认提取出的第二位数值都在你预期的1-5范围内,同时排查是否存在缺失值、非两位数字的异常记录。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

