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

为何pivot_wider会将数值类型转为列表类型?求列均值解决方法

解决pivot_wider后列类型为列表无法计算均值的问题

当pivot_wider后目标列变成列表类型,本质是每个分组下的RIGHT_GAZE_X有多个值,导致宽表单元格存储为列表。以下两种方法可解决:

方法1:将列表列转换为数值类型

场景1:每个列表仅含单个值

用map_dbl提取列表中的唯一数值,将列转为数值型:

library(tidyverse)

data <- read.csv("./b002003.csv", header = TRUE) %>%
  pivot_wider(
    names_from = TRIAL_INDEX,
    values_from = RIGHT_GAZE_X
  ) %>%
  # 针对第3、6列转换类型
  mutate(across(c(3, 6), ~map_dbl(.x, identity)))

# 正常计算行均值
data$rowmeans <- rowMeans(select(data, c(3, 6)))

场景2:每个列表含多个值

先对原数据按分组聚合取均值,再转宽表,避免生成列表列:

library(tidyverse)

data <- read.csv("./b002003.csv", header = TRUE) %>%
  # 替换...为你需要保留的所有非聚合列
  group_by(TRIAL_INDEX, ...) %>%
  summarise(RIGHT_GAZE_X = mean(RIGHT_GAZE_X), .groups = "drop") %>%
  pivot_wider(
    names_from = TRIAL_INDEX,
    values_from = RIGHT_GAZE_X
  )

data$rowmeans <- rowMeans(select(data, c(3, 6)))

方法2:直接对列表列计算均值

无需转换类型,用rowwise结合mean直接计算每行的列表均值:

library(tidyverse)

data <- read.csv("./b002003.csv", header = TRUE) %>%
  pivot_wider(
    names_from = TRIAL_INDEX,
    values_from = RIGHT_GAZE_X
  ) %>%
  rowwise() %>%
  mutate(rowmeans = mean(c(!!!select(., c(3, 6))))) %>%
  ungroup()

或者用pmap_dbl实现相同效果:

data$rowmeans <- pmap_dbl(select(data, c(3, 6)), ~mean(c(..1, ..2)))

内容的提问来源于stack exchange,提问作者111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:05:29