使用pivot_wider()遇嵌套列表问题:如何取均值并保留数值类型?
解决pivot_wider生成列表列并转换为均值的问题
方法一:先聚合再转宽表(推荐,高效)
在执行pivot_wider()之前,先按Arb_PersonID和LabComponentName分组计算均值,转宽表后直接得到numeric类型的列,完全避免列表生成:
library(tidyr) library(dplyr) dfx <- data.frame("Arb_PersonID" = c(1,1,2,2,2,2), "LabComponentName" = c("2ch", "4ch", "2ch", "4ch", "2ch", "4ch"), "LabResult" = c(56, 55, 50, 54, 56, 60)) # 分组计算均值后转宽表 dfx_processed <- dfx %>% group_by(Arb_PersonID, LabComponentName) %>% summarize(LabResult = mean(LabResult, na.rm = TRUE), .groups = "drop") %>% pivot_wider(names_from = LabComponentName, values_from = LabResult) # 查看结果类型 str(dfx_processed)
输出中2ch和4ch列均为numeric类型,对应均值分别为56、53和55、57,完全匹配需求。
方法二:处理已生成的列表列
如果已经执行pivot_wider()得到了带列表的宽表,可通过sapply()遍历列表计算均值,转换列类型:
# 先得到带列表的宽表 dfx_wide <- dfx %>% pivot_wider(names_from = LabComponentName, values_from = LabResult) # 转换列表列为均值(numeric类型) dfx_wide_fixed <- dfx_wide %>% mutate(across(c(`2ch`, `4ch`), ~ sapply(., mean, na.rm = TRUE))) # 查看结果类型 str(dfx_wide_fixed)
方法一的优势
针对14000行的数据集,先聚合再转宽表能减少中间数据量,处理效率更高,且从根源上避免了列表列的生成,无需额外转换步骤。
内容的提问来源于stack exchange,提问作者dsr
相关产品推荐
相关产品推荐

