如何在R语言中清理含混合高度单位的数据列并统一为厘米
处理混合单位的身高转换(厘米/英尺英寸转统一厘米数值)
针对你数据框中同时存在厘米和英尺英寸格式的身高数据,我们可以通过区分单位类型分别提取数值并转换的方式解决,以下是两种实现方法:
方法一:使用tidyverse工具链(dplyr + stringr)
先加载所需包,再通过字符串提取和条件计算完成转换:
library(dplyr) library(stringr) # 示例数据 df <- data.frame(v1 = c('100 cm', '6 foot 10', '200 cm', '5 foot 11')) # 转换并生成厘米列 df <- df %>% mutate( # 提取每行所有数字,生成列表格式的临时列 nums = str_extract_all(v1, "\\d+"), # 根据单位类型计算厘米数值 height_cm = case_when( # 含"cm"的行直接取数字转数值 str_detect(v1, "cm") ~ as.numeric(unlist(nums)), # 含"foot"的行,提取英尺和英寸分别转换后求和 str_detect(v1, "foot") ~ as.numeric(sapply(nums, `[`, 1)) * 30.48 + as.numeric(sapply(nums, `[`, 2)) * 2.54 ) ) %>% select(-nums) # 移除临时列 # 查看结果 df
方法二:Base R实现(无需额外包)
如果不想加载第三方包,可以用基础函数完成:
# 示例数据 df <- data.frame(v1 = c('100 cm', '6 foot 10', '200 cm', '5 foot 11')) # 提取所有数字:先清除非数字/空格字符,再按空格分割 nums_list <- strsplit(gsub("[^0-9 ]", "", df$v1), " +") # 转换为数值矩阵 nums_matrix <- do.call(rbind, lapply(nums_list, as.numeric)) # 计算厘米列 df$height_cm <- ifelse( grepl("cm", df$v1), nums_matrix[, 1], # 厘米行直接取第一个数字 nums_matrix[, 1] * 30.48 + nums_matrix[, 2] * 2.54 # 英尺英寸行转换求和 ) # 查看结果 df
两种方法最终都会生成height_cm列,包含统一的厘米数值:
v1 height_cm 1 100 cm 100.00 2 6 foot 10 208.28 3 200 cm 200.00 4 5 foot 11 180.34
内容的提问来源于stack exchange,提问作者lmnop
相关产品推荐
相关产品推荐

