You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将混合单位的R语言字符向量统一转换为厘米?

解决混合单位(英尺英寸/米/厘米)转厘米的问题

原函数的问题

你的m_cm函数出现全NA的原因有两个核心问题:

  1. 正则转义错误:strsplit的分隔符.是正则表达式的特殊字符(匹配任意单个字符),必须用\\.转义才能匹配实际的小数点,否则拆分结果完全错误。
  2. 逻辑不严谨:
    • 对于无小数点的纯数字(如"165"),拆分后只有一个元素,elem[2]会返回NA,导致计算结果为NA;
    • 拆分小数点的方式不适用于所有米制数值(比如"1.8"会被错误计算为108厘米,实际应为180厘米),直接将字符串转为数值后乘以100才是可靠的米转厘米方式。

另外,你当前的两个函数分别处理不同格式,无法统一处理所有情况,需要一个统一的判断转换函数。

完整解决方案

我们可以编写一个通用函数,通过正则表达式识别每个高度字符串的格式,然后对应转换为厘米:

# 先安装并加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:43:25