是否应使用unnest_wider与rowMeans计算列表列平均值?求高效方案
解决方法:两种场景的处理方案
一、针对当前带列表列的宽格式数据集
你遇到的unnest_wider报错,本质是参数传递不符合要求:该函数的第二个参数需要传入列名的字符/数值向量,你可能误传了数据框对象。不过其实不用展开列表列,直接对每行的列表计算平均值更高效:
方法1:用dplyr的rowwise+mean
library(dplyr) dataset <- dataset %>% rowwise() %>% mutate(avg_value = mean(years, na.rm = TRUE)) %>% # 将years替换为你的列表列名 ungroup()
方法2:用purrr的map_dbl批量计算
如果不用dplyr,也可以直接用purrr处理列表列:
library(purrr) dataset$avg_value <- map_dbl(dataset$years, ~mean(.x, na.rm = TRUE))
之前直接用rowMeans、apply无效,是因为这些函数仅支持数值型矩阵/数据框,无法识别列表类型的列。
二、推荐:直接从原始长格式计算(更简单高效)
你提到数据集是通过pivot_wider和t()转换而来,其实完全没必要转成宽格式再处理——原始长格式下计算平均值更直接,还能避免列表列的麻烦:
假设你的原始长格式数据结构如下(示例):
| 索引列 | years | value |
|---|---|---|
| 样本A | 2020 | 10 |
| 样本A | 2021 | 20 |
| 样本B | 2020 | 15 |
| 样本B | 2021 | 25 |
直接按索引分组计算平均值:
library(dplyr) original_long_data %>% group_by(索引列) %>% # 替换为你实际的索引列名 summarise(avg_value = mean(value, na.rm = TRUE)) # 替换为你实际的数值列名
如果不用dplyr,用基础R的aggregate也能实现:
aggregate(value ~ 索引列, data = original_long_data, FUN = mean, na.rm = TRUE)
这样得到的结果直接就是每个索引对应的平均值,步骤更少且不易出错。
内容的提问来源于stack exchange,提问作者user3278
相关产品推荐
相关产品推荐

