如何为pmap()的.l参数灵活传入可变长度的参数
解决方案
要实现动态适配任意数量condition的pmap调用,核心是让.l参数自动获取所有条件列,无需手动列写。这里提供几种可行方法:
方法1:利用整洁评估动态注入列
先提取所有condition对应的列名,通过syms()将字符串转为符号,再用!!!注入到list中:
library(tidyverse) POST_SIMS <- 2 CONDITIONS <- 3 DURATION <- 2 df <- tibble( day = rep(1:DURATION, each = CONDITIONS), condition = rep(LETTERS[1:CONDITIONS], times = DURATION) ) |> rowwise() |> mutate(post = list(rnorm(POST_SIMS, 0, 1))) |> ungroup() df_wide <- df |> pivot_wider( id_cols = c(day), names_from = "condition", values_from = 'post' ) # 提取所有条件列名 condition_cols <- unique(df$condition) df_wide |> mutate( post_max = pmap( .l = list(!!!syms(condition_cols)), # 动态生成列列表 .f = pmax ) ) |> unnest(post_max)
方法2:直接选择条件列传入pmap
无需符号转换,用select()选取所有条件列,pmap会自动将选中列转为符合要求的列表结构:
df_wide |> mutate( post_max = pmap( .l = select(., all_of(condition_cols)), # 选择指定条件列 .f = pmax ) ) |> unnest(post_max)
方法3:更通用的自动列选择
如果宽表中除day列外其余都是条件列,可直接排除day列,彻底摆脱对列名的依赖:
df_wide |> mutate( post_max = pmap( .l = select(., -day), # 自动选取所有非day列 .f = pmax ) ) |> unnest(post_max)
为什么之前的写法失效?
你尝试的list(my_conditions)是把字符串向量作为列表的单个元素传入,但pmap需要的是每个条件列作为列表的独立元素。上述方法都是通过将列对象(而非字符串)放入列表,匹配pmap的参数要求。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

