matt
matt

Reputation: 47

Analyse data frames inside a list of data frames and store all results in single data frame

I want to analyse individual data frames within a list of data frames and then store the results of each individual analysis in a new data frame. Any advice would be great, i've tried lapply() and a for loop but can't get either working.


I have a list of data frames:

d1 <- data.frame(exposure = c("e1", "e2", "e3"), outcome = c("o1", "o2", "o3"), b = c(1,1,1), lci = c(0.5,0.5,0.5), uci = c(1.5,1.5,1.5), p = c(0.05, 0.05, 0.05), id = c("e1_o1", "e2_02", "e3_03"))
d2 <- data.frame(exposure = c("e1", "e2", "e3"), outcome = c("o1", "o2", "o3"), b = c(1,1,1), lci = c(0.5,0.5,0.5), uci = c(1.5,1.5,1.5), p = c(0.05, 0.05, 0.05), id = c("e1_o1", "e2_02", "e3_03"))
data_list <- list(d1, d2)

I want to meta-anlyse the data within each data frame using the following code:

results <- metagen(data = data_list[[1]], TE = b, pval = p, level.ci = 0.95, lower = lci, upper = uci, studlab = id, method.tau = "PM", sm = "MD", hakn = F, adhoc.hakn = "ci", title = data_list[[1]]$id[1])

I then want to save the results of each meta-analysis in a single data frame:

table <- data.frame(title = results$title,
                    fe_effect = results$TE.fixed,
                    fe_lower = results$lower.fixed,
                    fe_upper = results$upper.fixed,
                    fe_p = results$pval.fixed,
                    re_effect = results$TE.random,
                    re_lower = results$lower.random,
                    re_upper = results$upper.random,
                    re_p = results$pval.random,
                    q = results$Q,
                    q_df = results$df.Q,
                    q_p = results$pval.Q,
                    tau2 = results$tau2,
                    tau2_se = results$se.tau2,
                    tau = results$tau,
                    h = results$H,
                    i1 = results$I2)

Upvotes: 1

Views: 62

Answers (2)

VitaminB16
VitaminB16

Reputation: 1234

You were almost there. You can use lapply like so:

results <- do.call(rbind,lapply(1:length(data_list), function(x) {
  results = metagen(data = data_list[[x]], TE = b, pval = p, level.ci = 0.95, lower = lci, upper = uci,
          studlab = id, method.tau = "PM", sm = "MD", hakn = F, adhoc.hakn = "ci", title = data_list[[x]]$id[1]);
  data.frame(title = results$title,
                    fe_effect = results$TE.fixed,
                    fe_lower = results$lower.fixed,
                    fe_upper = results$upper.fixed,
                    fe_p = results$pval.fixed,
                    re_effect = results$TE.random,
                    re_lower = results$lower.random,
                    re_upper = results$upper.random,
                    re_p = results$pval.random,
                    q = results$Q,
                    q_df = results$df.Q,
                    q_p = results$pval.Q,
                    tau2 = results$tau2,
                    tau2_se = results$se.tau2,
                    tau = results$tau,
                    h = results$H,
                    i1 = results$I2)
}))
> results
  title fe_effect  fe_lower fe_upper         fe_p re_effect  re_lower re_upper         re_p q q_df q_p tau2    tau2_se tau h i1
1 e1_o1         1 0.7113249 1.288675 1.125116e-11         1 0.7113249 1.288675 1.125116e-11 0    2   1    0 0.06507944   0 1  0
2 e1_o1         1 0.7113249 1.288675 1.125116e-11         1 0.7113249 1.288675 1.125116e-11 0    2   1    0 0.06507944   0 1  0

Upvotes: 2

Sam Dickson
Sam Dickson

Reputation: 5239

Try do.call()

library(meta)

d1 <- data.frame(exposure = c("e1", "e2", "e3"), outcome = c("o1", "o2", "o3"), b = c(1,1,1), lci = c(0.5,0.5,0.5), uci = c(1.5,1.5,1.5), p = c(0.05, 0.05, 0.05), id = c("e1_o1", "e2_02", "e3_03"))
d2 <- data.frame(exposure = c("e1", "e2", "e3"), outcome = c("o1", "o2", "o3"), b = c(1,1,1), lci = c(0.5,0.5,0.5), uci = c(1.5,1.5,1.5), p = c(0.05, 0.05, 0.05), id = c("e1_o1", "e2_02", "e3_03"))
data_list <- list(d1, d2)

table_list <- NULL

for(i in 1:length(data_list)) {
  results <- metagen(data = data_list[[i]], TE = b, pval = p, level.ci = 0.95, lower = lci, upper = uci, studlab = id, method.tau = "PM", sm = "MD", hakn = F, adhoc.hakn = "ci", title = data_list[[i]]$id[i])
  table_list[[i]] <- data.frame(title = results$title,
                                fe_effect = results$TE.fixed,
                                fe_lower = results$lower.fixed,
                                fe_upper = results$upper.fixed,
                                fe_p = results$pval.fixed,
                                re_effect = results$TE.random,
                                re_lower = results$lower.random,
                                re_upper = results$upper.random,
                                re_p = results$pval.random,
                                q = results$Q,
                                q_df = results$df.Q,
                                q_p = results$pval.Q,
                                tau2 = results$tau2,
                                tau2_se = results$se.tau2,
                                tau = results$tau,
                                h = results$H,
                                i1 = results$I2)
}

table = do.call(rbind,table_list)

Upvotes: 2

Related Questions