为何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
相关产品推荐
相关产品推荐

