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

