将列表(具有重复模式)转换为 R 中的 data.frame

问题描述 投票:0回答:1

我正在使用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)

但是得到这个:

任何帮助都会很棒!

r dataframe list repeat
1个回答
0
投票
# 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
© www.soinside.com 2019 - 2024. All rights reserved.