使用 map2 和 qnorm 创建变量

create variables with map2 and qnorm

鉴于:

library(tidyverse)
df <- data.frame(est = c(1.36, -0.03),
                 std = c(0.16, 0.18))
df
#     est  std
# 1  1.36 0.16
# 2 -0.03 0.18

我想做以下事情:

exp(df[1, 1] + qnorm(c( 0.025, 0.5, 0.975))*df[1, 2])
# [1] 2.847398 3.896193 5.331295
exp(df[2, 1] + qnorm(c( 0.025, 0.5, 0.975))*df[2, 2])
# [1] 0.6819537 0.9704455 1.3809802

得到以下 df:

df_final
#     est  std        or        ll       ul
# 1  1.36 0.16 2.8473980 3.8961930 5.331295
# 2 -0.03 0.18 0.6819537 0.9704455 1.380980

我不确定为什么这行不通:

df[c("or", "ll", "ul")] <- map2(df %>% select(est),
                               df %>% select(std), ~ exp(.x + qnorm(c( 0.025, 0.5, 0.975))*.y))

有什么想法吗?谢谢

我们可以使用pmap

library(purrr)
library(dplyr)
pmap_dfr(df, ~ exp(..1 + qnorm(c(0.025, 0.5, 0.975)) * ..2) %>% 
        as.list %>% 
        setNames(c('or', 'll', 'ul'))) %>% 
  bind_cols(df, .)

-输出

  est  std        or        ll       ul
1  1.36 0.16 2.8473985 3.8961933 5.331295
2 -0.03 0.18 0.6819537 0.9704455 1.380980

在 OP 的 post 中,它是 select 列,它仍然是具有单列的 data.frame/tibble。相反,它应该被提取为 vector,即 pull。当我们有 data.frame 时,循环的单位是列而不是行,即

df[c("or", "ll", "ul") <-  map2(df %>% pull(est),
                               df %>% pull(std), 
     ~ exp(.x + qnorm(c( 0.025, 0.5, 0.975))*.y)) %>% 
       invoke(rbind, .)

或者可以使用dapply

library(collapse)
f1 <- function(x) setNames(exp(x[1] + 
    qnorm(c(0.025, 0.5, 0.975)) * x[2]), c('or', 'll', 'ul'))
cbind(df, dapply(df, MARGIN = 1, f1))
  est  std        or        ll       ul
1  1.36 0.16 2.8473985 3.8961933 5.331295
2 -0.03 0.18 0.6819537 0.9704455 1.380980

在 base R 中你可以使用:

a <- exp(df[[1]] + t(qnorm(c( 0.025, 0.5, 0.975)) %o% df[[2]])) 
cbind(df, setNames(data.frame(a),c('or', 'll', 'ul')))

    est  std        or        ll       ul
1  1.36 0.16 2.8473985 3.8961933 5.331295
2 -0.03 0.18 0.6819537 0.9704455 1.380980