如何将混合单位的R语言字符向量统一转换为厘米?
解决混合单位(英尺英寸/米/厘米)转厘米的问题
原函数的问题
你的m_cm函数出现全NA的原因有两个核心问题:
- 正则转义错误:
strsplit的分隔符.是正则表达式的特殊字符(匹配任意单个字符),必须用\\.转义才能匹配实际的小数点,否则拆分结果完全错误。 - 逻辑不严谨:
- 对于无小数点的纯数字(如"165"),拆分后只有一个元素,
elem[2]会返回NA,导致计算结果为NA; - 拆分小数点的方式不适用于所有米制数值(比如"1.8"会被错误计算为108厘米,实际应为180厘米),直接将字符串转为数值后乘以100才是可靠的米转厘米方式。
- 对于无小数点的纯数字(如"165"),拆分后只有一个元素,
另外,你当前的两个函数分别处理不同格式,无法统一处理所有情况,需要一个统一的判断转换函数。
完整解决方案
我们可以编写一个通用函数,通过正则表达式识别每个高度字符串的格式,然后对应转换为厘米:
# 先安装并加载units包(用于单位转换) # install.packages("units") library(units) convert_to_cm <- function(height_str) { # 识别英尺英寸格式(包含') if (grepl("'", height_str)) { elem <- as.integer(unlist(strsplit(height_str, "'"))) inch_total <- elem[1] * 12 + elem[2] return(as.numeric(conv_unit(set_units(inch_total, "inch"), "cm"))) } # 识别米格式(包含.) else if (grepl("\\.", height_str)) { m_value <- as.numeric(height_str) return(m_value * 100) } # 剩余情况视为厘米格式 else { return(as.numeric(height_str)) } } # 测试示例向量 Height <- c("165", "185", "5'1", "1.88") Height_converted <- sapply(Height, convert_to_cm) # 查看结果 Height_converted
运行结果
165 185 5'1 1.88 165.00 185.00 154.94 188.00
代码说明
- 正则判断:用
grepl("'", height_str)识别英尺英寸格式,grepl("\\.", height_str)识别米格式; - 英尺英寸转厘米:保留你原有的逻辑,用
units包的conv_unit完成单位转换(需用set_units明确原单位); - 米转厘米:直接将字符串转为数值后乘以100,避免拆分小数点的错误;
- 厘米格式:直接转为数值返回。
扩展说明
如果你的更长向量中还有其他格式(比如"5'1''"带双引号的英寸、"180cm"带单位后缀),可以扩展正则判断条件:
- 处理带双引号的英尺英寸:
grepl("\\d+'\\d+''?", height_str) - 处理带cm后缀的数值:
grepl("cm$", height_str, ignore.case = TRUE),提取数字部分后转换。
内容的提问来源于stack exchange,提问作者Zac Cotterell
相关产品推荐
相关产品推荐

