我正在使用repeat{}函数在R中运行一些模拟,由于某些上下文原因,我无法将代码块转换为使用apply函数的东西(或更有效/高效的东西)。我使用以下代码将输出从 Repeat{} 函数迭代保存到 list() 中:
results<-list()
sim<-list()
reps <- 5
n1=5
n2=5
low_eqbound_d=-.3
high_eqbound_d=.3
count<-0
repeat {
x<-rnorm(n1,0,2)
y<-rnorm(n2,2,2)
print(mid<-mean(x)-mean(y))
sdpooled <- sqrt((((n1 - 1) * (sd(x)^2)) + (n2 - 1) * (sd(y)^2))/((n1 + n2) - 2))
low_eqbound <- low_eqbound_d * sdpooled
high_eqbound <- high_eqbound_d * sdpooled
if(mid<low_eqbound & mid>high_eqbound){
next
}
if(mid>=low_eqbound & mid<=high_eqbound){
sim <- TOST(m1=mean(x),m2=mean(y),sd1=sd(x),sd2=sd(y),n1=n,n2=n,
low_eqbound_d=-0.3,high_eqbound_d=0.3)
results <- append(results,sim)
count<-count+1
}
if(count==5){
break
}
}
results1<-as.data.frame(results)
列表最后看起来像这样:
我想将其转换为 data.frame 以进行进一步分析/可视化。请注意,我需要从列表中提取 5 条数据,并且这会沿着整个对象重复。我想创建一个包含 5 列的 data.frame,并从列表中取出每个条目并将其放入 data.frame 的每一列中,对代码中的所有重复项重复此操作。我尝试使用 as.data.frame()
results1 <- as.data.frame(results)
但是得到这个:
任何帮助都会很棒!
# Toy data:
mylist <- list(
diff = 1,
TOST_r1 = 2,
TOST_r2 = 3,
diff = 4,
TOST_r1 = 5,
TOST_r2 = 6)
您可以先重命名列名称,然后使用模式将数据转换为长格式:
library(tidyr)
library(dplyr)
mylist |>
as.data.frame() |>
rename_with(function(x) paste0(x, ".0"), .cols = -contains(".")) |>
pivot_longer(everything(),
names_to = c(".value", "id"),
names_sep = "\\.")
# A tibble: 2 × 4
id diff TOST_r1 TOST_r2
<chr> <dbl> <dbl> <dbl>
1 0 1 2 3
2 1 4 5 6