Saya memiliki daftar daftar seperti keluar. Di setiap daftar daftar saya memiliki kerangka data (dengan struktur yang sama, yaitu variabel yang sama).

out <- replicate(4, rep(list(NULL), 2), simplify = FALSE)

Keinginan saya adalah untuk mengikat semua kerangka data yang termasuk dalam daftar daftar pertama, yang kedua bersama-sama (dalam latihan asli saya, saya memiliki lebih dari 4 daftar dari 2 daftar ... Untuk contoh ini saya akan melakukan sesuatu seperti berikut:

dataframe1 <- rbind(out[[1]][[1]], out[[2]][[1]], out[[3]][[1]], out[[4]][[1]])
dataframe2 <- rbind(out[[1]][[2]], out[[2]][[2]], out[[3]][[2]], out[[4]][[2]])

Adakah ide tentang bagaimana melakukannya secara iteratif dan lebih elegan?

PS: Maaf karena tidak membagikan data nyata.

0
vog 3 Juni 2021, 21:11

2 jawaban

Jawaban Terbaik

Berikut adalah pendekatan menggunakan rlist dan purr

do.call(rlist::list.zip, out) %>%
 purrr::map(~ do.call(rbind, .))

Atau, dengan lebih banyak purrr:

library(purrr)

out %>%
  do.call(rlist::list.zip, .) %>%
  map(~ reduce(., rbind))
1
ktiu 3 Juni 2021, 18:21

Ketika semua bingkai Anda terstruktur dengan cara yang sama atau sama dan Anda bermaksud untuk "hal" yang sama untuk semuanya, umumnya yang terbaik adalah bekerja dengan daftar bingkai alih-alih elemen individual.

out <- replicate(4, rep(list(mtcars[c(1,3),1:3]), 2), simplify = FALSE)
out[[1]][[1]]
#             mpg cyl disp
# Mazda RX4  21.0   6  160
# Datsun 710 22.8   4  108

lapply(1:2, function(ind) do.call(rbind, lapply(out, `[[`, ind)))
# [[1]]
#              mpg cyl disp
# Mazda RX4   21.0   6  160
# Datsun 710  22.8   4  108
# Mazda RX41  21.0   6  160
# Datsun 7101 22.8   4  108
# Mazda RX42  21.0   6  160
# Datsun 7102 22.8   4  108
# Mazda RX43  21.0   6  160
# Datsun 7103 22.8   4  108
# [[2]]
#              mpg cyl disp
# Mazda RX4   21.0   6  160
# Datsun 710  22.8   4  108
# Mazda RX41  21.0   6  160
# Datsun 7101 22.8   4  108
# Mazda RX42  21.0   6  160
# Datsun 7102 22.8   4  108
# Mazda RX43  21.0   6  160
# Datsun 7103 22.8   4  108

Jika Anda sudah menggunakan dplyr atau data.table, maka ini relatif setara tetapi seringkali sedikit lebih aman:

lapply(1:2, function(ind) data.table::rbindlist(lapply(out, `[[`, ind), fill = TRUE, use.names = TRUE))
lapply(1:2, function(ind) dplyr::bind_rows(lapply(out, `[[`, ind)))
1
r2evans 3 Juni 2021, 18:33