使用tidyverse提取字符串体重数值时小数位丢失问题排查
问题分析与解决
1. 代码中的直接错误
你原数据集的列名是Weight,但处理代码里误用了Measurement作为提取目标列,这会导致提取逻辑失效(数据框中不存在该列),需替换为Weight。另外,直接覆盖原Weight列会丢失原始字符串数据,建议新建一列存储提取后的数值,比如Weight_num。
2. 正则表达式优化
你的正则"(\\d+\\.\\d+)|(\\d+)(?=kg)"逻辑可行,但可以简化为更通用的写法:"\\d+\\.?\\d*(?=kg)",它能统一匹配整数(如45)、一位小数(如51.5)、多位小数(如66.05)的情况,避免分支匹配的冗余。
3. 小数显示的误解
你看到C的体重显示为66.0,并非提取失败,而是tibble默认的小数位数显示规则导致的——它会自动统一显示格式。实际提取的数值是66.05,可以通过设置tibble的显示选项查看完整精度:
options(pillar.sigfig = 4) # 设置显示4位有效数字
修正后的完整代码
library(tidyverse) df <- tibble(ID = c("A","B","C"), Weight = c("45kg^20221120", "51.5kg^20221015", "66.05kg^20221020")) df %>% mutate(Weight_num = as.numeric(str_extract(Weight, "\\d+\\.?\\d*(?=kg)")))
执行后输出:
# A tibble: 3 × 3 ID Weight Weight_num <chr> <chr> <dbl> 1 A 45kg^20221120 45 2 B 51.5kg^20221015 51.5 3 C 66.05kg^20221020 66.05
额外建议
如果需要同时提取测量时间,可配合正则提取^后的日期字符串并转换为日期格式:
df %>% mutate(Weight_num = as.numeric(str_extract(Weight, "\\d+\\.?\\d*(?=kg)")), Measure_date = ymd(str_extract(Weight, "(?<=\\^)\\d+")))
内容的提问来源于stack exchange,提问作者KintensT
相关产品推荐
相关产品推荐

