如何在R语言中将带单位的列表转为数值并判断高低?
解决R语言中带单位的列表数据转换与分类问题
问题分析
你的OHP$ohp17.value是混合了NULL、带单位字符串和纯数字字符串的列表,直接unlist后用as.numeric转换会因为单位字符导致失败,而且if语句无法处理向量型数据,必须用向量化的判断函数。
解决方案代码
# 1. 将列表转为字符向量,把NULL替换为NA ohp_vec <- sapply(OHP$ohp17.value, function(x) if(is.null(x)) NA else x) # 2. 提取字符串中的数字部分(正则匹配数字和小数点) ohp_numeric <- as.numeric(stringr::str_extract(ohp_vec, "\\d+\\.?\\d*")) # 3. 用向量化的ifelse进行高低分类 OHP$ohp17_category <- ifelse(ohp_numeric < 18, "Low", "High")
代码解释
- 步骤1:用
sapply遍历列表,把所有NULL转为NA,得到统一的字符向量,避免后续处理出错。 - 步骤2:使用
stringr::str_extract配合正则表达式\\d+\\.?\\d*,提取每个字符串里的数字(包含整数和小数),再转为数值型。如果没有stringr包,先运行install.packages("stringr")安装。 - 步骤3:用
ifelse替代if,因为if只能处理单个逻辑值,而ifelse可以对整个向量的每个元素做判断,生成对应的分类结果。
替代方案(不依赖stringr包)
如果不想安装额外包,可以用基础R的gsub去掉非数字和小数点的字符:
ohp_numeric <- as.numeric(gsub("[^0-9.]", "", ohp_vec))
内容的提问来源于stack exchange,提问作者Bev
相关产品推荐
相关产品推荐

