Запустите цикл for над списком, сохраните каждый объект списка в выходной матрице

#r

#r

Вопрос:

Я хочу запустить цикл for над списком. У меня есть 3 вопроса:

  1. Интересно, как я выбираю каждый список в «i в 1: список», когда делаю то же самое для фрейма данных, для которого он может быть (i в 1: ncol (df)), но как это должно быть записано для списка?
  2. Мне также интересно, как я мог бы «добавить» значения для каждого цикла в «выходную» матрицу?
  3. Как преобразовать список во фрейм данных. При выполнении этого, как data.frame(df3), они будут добавлены по столбцам, количество строк всегда будет равно 3.

Большое спасибо, если у кого-то есть предложения!

     name <- rep("gg",3) 
id <- LETTERS[1:3]
emmeans <- runif(1:3)
SE <- runif(1:3)
p <- rep(c(0.001),3)
df <- data.frame(name,id, emmeans,p)
df
df  <- list(df)

name <- rep("ff",3) 
id <- LETTERS[1:3]
emmeans <- runif(1:3)
SE <- runif(1:3)
p <- rep(c(0.003),3)

df2 <- data.frame(name,id, emmeans,p)
df2 <- list(df2)

df3 <- list(df,df2)
df3
> df3
[[1]]
[[1]][[1]]
  name id   emmeans     p
1   gg  A 0.2248491 0.001
2   gg  B 0.4213938 0.001
3   gg  C 0.3671521 0.001


[[2]]
[[2]][[1]]
  name id   emmeans     p
1   ff  A 0.2561801 0.003
2   ff  B 0.1705811 0.003
3   ff  C 0.9714178 0.003

output <- matrix(nrow=2, ncol=5)

for(i in 1:list){ # what could be written here?
  d <- as.data.frame(df3[[i]])
  for(j in 1:nrow(d)){
    output[i,1] <- d[1,3]
    output[i,2] <- d[2,3]
    output[i,3] <- d[3,3]
    output[i,4] <- d[1,4]
    output[i,5] <- d[1,1]
  }
}

#Wanted outcome:
output
     [,1]                [,2]                [,3]                [,4]    [,5]
[1,] "0.224849119782448" "0.421393777942285" "0.367152112303302" "0.001" "gg"
[2,] "0.256180095253512" "0.170581063022837" "0.971417842432857" "0.003" "ff"
 

Комментарии:

1.1. length(df3) , 2. cbind , 3. dplyr::bind_rows(df3)

2. Но (2) ужасно неэффективно — настройте так, чтобы ваша выходная матрица имела правильный размер с самого начала, а затем замените значения по умолчанию вашими фактическими результатами в вашем цикле, вместо того, чтобы «увеличивать» вашу матрицу, увеличивая ее с каждой итерацией.

3. @Gregor Thomas спасибо за ваш ответ! У вас есть предложения о том, как это сделать?

4. Мне трудно понять, какова ваша фактическая цель. У вас есть output <- matrix(nrow=6, ncol=2) , так что вы уже инициализируете output некоторый размер — просто убедитесь, что size — это конечный размер, который вы хотите, чтобы он был.

5. Также трудно сказать, что происходит с вашей настройкой. Например, у вас есть df <- data.frame(name,id, q1,q2) , как df и фрейм данных. Тогда вы делаете df <- list(df) , так что теперь df это список, содержащий только фрейм данных. И затем то же самое для df2 . Затем, когда вы это сделаете df3 <- list(df, df2) , у вас будет список, состоящий из 2 элементов, и каждый элемент представляет собой список, содержащий один фрейм данных — относительно сложную структуру данных.

Ответ №1:

Эти данные достаточно странно структурированы, а извлечение достаточно уникально, поэтому я думаю for , что цикл — самый простой способ. Что-то вроде этого:

 output <- matrix(nrow = length(df3), ncol=5)
for(i in seq_along(df3)) {
  output[i, ] = with(df3[[i]], c(emmeans, p[1], name[1]))
}
output
#      [,1]                 [,2]               [,3]                [,4]    [,5]
# [1,] "0.0101301828399301" "0.21454192395322" "0.913734979229048" "0.003" "ff"
# [2,] "0.0101301828399301" "0.21454192395322" "0.913734979229048" "0.003" "ff"