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