You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:05:40