दिया गया:

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))

कोई विचार? धन्यवाद

1
user63230 26 जिंदा 2022, 21:20

2 जवाब

हम 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

ओपी के पद में, यह 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
1
akrun 26 जिंदा 2022, 21:46
धन्यवाद, मुझे नहीं लगा कि मुझे pull की आवश्यकता है, हालांकि मैंने इसे यहां नहीं किया: stackoverflow.com/a/69379945 4083743
 – 
user63230
26 जिंदा 2022, 21:33
जब आप map(df, ~ .x) करते हैं तो इकाई एक कॉलम होती है और इस प्रकार यह कॉलम पर लूप होती है। map2 के साथ, आपको प्रत्येक संबंधित पंक्ति के लिए 'est', 'std' दोनों की आवश्यकता होती है।
 – 
akrun
26 जिंदा 2022, 21:34
यह एक अलग मामला था, जब आपके पास एक से अधिक कॉलम होते हैं और उन संबंधित कॉलम में फ़ंक्शन लागू करना चाहते हैं। यहां, आपका उद्देश्य प्रत्येक कॉलम पर संपूर्ण रूप से फ़ंक्शन लागू करना नहीं है, बल्कि पंक्तियों पर लागू करना है
 – 
akrun
26 जिंदा 2022, 21:39

आधार आर में आप उपयोग कर सकते हैं:

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
0
Onyambu 26 जिंदा 2022, 21:43