R:无法使用 mutate 生成基于从 bc.mean.sd 函数输出的列表组件的变量

R: Trouble using mutate to produce variable based on list component outputted from bc.mean.sd function

作为荟萃分析的一部分,我一直在尝试使用 estmeansd 包 (v0.2.1) 中的 bc.mean.sd 来计算缺失均值和 sds usingmedian/IQR 数据。我已将数据清理成一个简单的集合(如下所示)来探索这个问题。

library(estmeansd)
library(dplyr)

df <- tibble::tribble(
          ~iqr1       ,    ~median        ,        ~iqr2    ,  ~n,
          21.1        ,      23.35        ,         25.2    ,  40,
          20.8        ,      25.00        ,         27.0    ,  30,
          26.8        ,      28.00        ,         29.0    ,  30,
          15.0        ,      22.50        ,         29.0    ,  30,
          26.8        ,      28.00        ,         29.0    ,  30,
          20.8        ,      25.00        ,         27.0    ,  30,
          23.5        ,      26.00        ,         28.0    ,  20
          )

函数 returns 一个包含不同组件的列表,我一直想使用 mutate 转换我的数据集以每行生成 2 个新变量,一个带有 $est.mean,一个带有 $ est.sd.

该函数可以很好地处理手动值,当我在其中分配单个值时,它似乎也可以正常工作,例如

set.seed(1)
  test <- bc.mean.sd(q1.val = dfm_cm$cognitive_iqr1_treat[1],   
                       med.val = dfm_cm$cognitive_median_treat[1],  
                       q3.val  = dfm_cm$cognitive_iqr2_treat[1],    
                       n  = dfm_cm$n_treat[1])$est.mean

我尝试使用 mutate 将其编码为:

  set.seed(1)
  df2 <-  df %>%
    mutate(
      new_t_mean =  bc.mean.sd(q1.val = iqr1,   
                               med.val = median,  
                               q3.val  = iqr2,    
                                    n  = n)$est.mean
    )

如果我只有一行(在第一个管道运算符后插入 slice(1) %>%),这实际上有效,但如果行数超过该行(如上所述),我会收到错误消息:

Warning messages:
1: Problem while computing `new_t_mean = ...$est.mean`.
i the condition has length > 1 and only the first element will be used 

事实上,所有返回值都是相同的。

我可以强行执行此操作,但我想了解我做错了什么,尤其是当我以非常相似的方式使用此 $ 赋值时,我的代码的另一部分没有问题(包括在下面供参考,但注意它使用了与我介绍的不同的函数和不同的变量——足以说明它有效)。我认为该功能的幕后可能发生了一些超出我目前在 R 方面的专业知识的事情。

非常感谢任何帮助。

Working analoguous example
library(esc)
df3 <- df %>%
  mutate(es =  esc_mean_sd(grp1m = mean_cont, 
                           grp1sd = sd_cont, 
                           grp1n = n_cont  ,   
                           grp2m = mean_treat,   
                           grp2sd = sd_treat,  
                           grp2n = n_treat ,   
                           es.type = "g")$es
)

尝试像这样使用 rowwise()

f <- function(v1,m,v2,n) {
 res = bc.mean.sd(q1.val = v1,med.val = m,  q3.val  = v2, n  = n)
 list("est.mean" = res$est.mean, "est.sd" = res$est.sd)
}

df %>%
  rowwise() %>% 
  mutate(k = list(f(iqr1,median,iqr2,n))) %>%
  unnest_wider(k)

输出:

   iqr1 median  iqr2     n est.mean est.sd
  <dbl>  <dbl> <dbl> <dbl>    <dbl>  <dbl>
1  21.1   23.4  25.2    40     22.9   3.20
2  20.8   25    27      30     23.6   4.79
3  26.8   28    29      30     27.8   1.73
4  15     22.5  29      30     21.8   8.09
5  26.8   28    29      30     28.0   1.76
6  20.8   25    27      30     23.6   4.52
7  23.5   26    28      20     25.5   3.88

该功能不是必需的;你也可以直接这样做,像这样:

df %>%
  rowwise() %>% 
  mutate(k = list(bc.mean.sd(
    q1.val=iqr1,
    med.val=median,
    q3.val=iqr2,
    n=n)[c("est.mean", "est.sd")])
    ) %>% 
  unnest_wider(k)