作为元分析的一部分,我一直在尝试使用来自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)