如何用filter和pivot_longer筛选规整肿瘤MRI尺寸数据错误记录
提取肿瘤MRI随访记录中的错误条目
我有一个记录多次随访肿瘤MRI扫描XY轴尺寸的大型DataFrame,示例数据如下:
id debut_extramea_xy_dimension_MR fu1_extramea_xy_dimension_MR fu2_extramea_xy_dimension_MR fu3_extramea_xy_dimension_MR 1 134 14x14 14x14 12.5x10.5 12.5x10.5 2 434 24 x 19 x 13 24 x 17 24 x 17 21 x 16 3 437 40 x 30 20 x 20 mm 20 x 20 25 x 18 4 440 26 x 24 26 x 24 26 x 24 26 x 24 5 498 13x6.4 14.8x8.7 19.4x12.3 21.7x13.5
数据存在两类错误:
- 部分记录被误存为XYZ三维尺寸(如id=434的debut字段)
- 部分记录额外添加了计量单位(如id=437的fu1字段)
需要使用dplyr的pivot_longer和filter函数,提取出包含id、随访阶段、错误内容的三列DataFrame,用于手动修正数据库。期望输出:
id name value 1 434 debut 24 x 19 x 13 2 437 fu1 20 x 20 mm
数据结构定义:
p <- structure(list(id = c(134L, 434L, 437L, 440L, 498L), debut_extramea_xy_dimension_MR = c("14x14", "24 x 19 x 13", "40 x 30", "26 x 24", "13x6.4"), fu1_extramea_xy_dimension_MR = c("14x14", "24 x 17", "20 x 20 mm", "26 x 24", "14.8x8.7"), fu2_extramea_xy_dimension_MR = c("12.5x10.5", "24 x 17", "20 x 20", "26 x 24", "19.4x12.3"), fu3_extramea_xy_dimension_MR = c("12.5x10.5", "21 x 16", "25 x 18", "26 x 24", "21.7x13.5")), row.names = c(NA, -5L), class = "data.frame")
解决代码
使用dplyr包的函数完成转换和筛选:
library(dplyr) library(stringr) p_clean <- p %>% # 将宽格式转为长格式,提取并简化随访阶段名称 pivot_longer( cols = starts_with(c("debut", "fu")), names_to = "name", values_to = "value", names_transform = list(name = ~ sub("_extramea_xy_dimension_MR", "", .x)) ) %>% # 筛选两类错误记录 filter( # 匹配包含2个及以上"x"(含空格)的三维记录 str_count(value, "\\s*x\\s*") >= 2 | # 匹配包含"mm"单位的记录 grepl("mm", value) ) print(p_clean)
代码说明
pivot_longer:将多列随访数据转为长格式,通过names_transform去掉字段名中冗余的后缀,得到简洁的随访阶段名称(如debu转为debut,fu1_extramea_xy_dimension_MR转为fu1)。filter:通过正则表达式精准筛选错误条目:str_count(value, "\\s*x\\s*") >= 2:统计记录中"x"(含前后空格)的数量,≥2则判定为三维尺寸错误。grepl("mm", value):检查记录是否包含"mm"字符串,判定为多余单位错误。
输出结果
# A tibble: 2 × 3 id name value <int> <chr> <chr> 1 434 debut 24 x 19 x 13 2 437 fu1 20 x 20 mm
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

