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



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

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
)

函数返回具有不同组件的列表,并且我一直想使用mutate转换我的数据集以每行产生2个新变量,其中一个带有$est。平均值为$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 

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

我可以强制执行,但我想了解我做错了什么,特别是因为我以非常类似的方式使用了这个$赋值,而在我的代码的另一部分中没有问题(包括下面的ref,但NB它使用了不同的函数和不同的变量,我已经提出了-足以说它工作)。我认为在这个功能的幕后可能发生了一些事情,超出了我目前在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)

最新更新