Reputation: 47
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
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
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