使用 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
鉴于:
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