R语言pivot_wider生成列表列 如何分组计算检验指标统计量
问题原因
pivot_wider生成列表列是因为单个encounter_id对应同一within_24_hours取值存在多条观测,宽格式单个单元格无法存储多个数值,函数默认将值封装为列表。这个需求不需要转宽格式,按「过滤-分组-汇总」的流程直接处理即可,逻辑更简洁,运行效率更高。
可直接运行的实现代码
library(tidyverse) # 示例数据构造(和你给出的代码一致) encounter_id <- c(1,1,1, 2,2,2, 3,3,3, 4,4,4) wbc <- c(13,NA,13, NA,NA,14, 15,9,15, 11,10,12) hb <- c(13,NA,12, NA,13,14, 15,NA,15, 11,8,12) temp <- c(100,NA,97, 103,NA,104, 100,99,NA, 100,101,101) hr <- c(133,NA,132, NA,NA,104, 155,160,NA, 60,NA,70) within_24_hours <- c(1,0,1, 1,1,0, 1,1,1, 0,0,1) df <- tibble(encounter_id, wbc, hb, temp, hr, within_24_hours) # 核心计算逻辑 df_result <- df %>% # 筛选24小时内的采集记录 filter(within_24_hours == 1) %>% # 按就诊ID分组 group_by(encounter_id) %>% # 批量计算四个检验指标的统计量 summarise( across( .cols = c(wbc, hb, temp, hr), .fns = list( mean = ~mean(.x, na.rm = T), median = ~median(.x, na.rm = T), max = ~max(.x, na.rm = T), min = ~min(.x, na.rm = T) ), .names = "{.col}_{.fn}" ) )
代码说明
- 所有统计函数均添加
na.rm = T参数,自动跳过数据中的缺失值,适配示例数据中的NA情况 - 用
across()批量处理多列,避免逐列编写重复的统计代码 - 输出列名自动按「指标名_统计量」格式命名,比如
wbc_mean对应白细胞均值,hb_max对应血红蛋白最大值,可读性强
结果预览
运行后输出4行结果,每个就诊ID对应一行聚合数据:
# A tibble: 4 × 17 encounter_id wbc_mean wbc_median wbc_max wbc_min hb_mean hb_median hb_max hb_min temp_mean temp_median temp_max temp_min hr_mean hr_median hr_max hr_min <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 13 13 13 13 12.5 12.5 13 12 98.5 98.5 100 97 132.5 132.5 133 132 2 2 14 14 14 14 13 13 13 13 103 103 103 103 104 104 104 104 3 3 13 15 15 9 15 15 15 15 99.5 99.5 100 99 157.5 157.5 160 155 4 4 12 12 12 12 12 12 12 12 101 101 101 101 70 70 70 70
如果坚持要用宽格式思路处理,需要先给每个组内的记录添加行序号作为唯一标识,再执行
pivot_wider,但这个步骤完全多余,不推荐使用。
内容的提问来源于stack exchange,提问作者crytpodoc
相关产品推荐
相关产品推荐

