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

R语言tidyr中pivot_wider的values_fn使用多函数不聚合问题求解

解决方案

问题原因

你遇到的问题是values_fn参数的传参格式不符合要求:当你使用单values_from列、多names_from分类的场景下,要给不同的输出列指定不同的聚合函数,需要明确values_fn的层级匹配规则:第一层键匹配values_from指定的列名,第二层键才匹配names_from生成的输出列名。你之前的写法跳过了第一层的values_from列名匹配,所以tidyr无法识别你指定的函数应用目标,就会返回列表列并抛出警告。

方案1:全版本兼容写法(推荐)

先按分组加Name列聚合,再转宽表,逻辑清晰,所有tidyr版本都可正常运行:

library(dplyr)
library(tidyr)

iris.long %>%
  group_by(Species, seq, Name) %>%
  summarise(
    Value = case_when(
      Name == "Sepal.Length" ~ mean(Value),
      Name == "Sepal.Width" ~ min(Value)
    ),
    .groups = "drop"
  ) %>%
  pivot_wider(
    id_cols = c(Species, seq),
    names_from = Name,
    values_from = Value
  )

方案2:适配values_fn参数格式写法

如果你使用tidyr 1.2.0及以上版本,只需调整values_fn的层级结构即可,不需要额外的分组合并步骤:

iris.long %>% 
  pivot_wider(
    id_cols = c("Species", "seq"), 
    names_from = "Name", 
    values_from = "Value", 
    values_fn = list(
      Value = list(
        Sepal.Length = mean, 
        Sepal.Width = min
      )
    )
  )

运行后即可得到预期结果:Sepal.Length列是同一分组下的均值,Sepal.Width列是同一分组下的最小值,无列表列和警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:06:06