Saya memiliki daftar yang berisi beberapa daftar yang semuanya memiliki struktur yang sama:

ls <- list(
one = list(df = data.frame(var1_1 = c(1, 1, 1),
                           var1_2 = c('a', 'a', 'a')),
           ls = list(n_df_1 = data.frame(var3_1 = c('x', 'x', 'x'),
                                         var3_2 = c(4, 4, 4))),
           name = c("one", "one", "one")),
two = list(df = data.frame(var1_1 = c(1, 1, 1),
                           var1_2 = c('a', 'a', 'a')),
           ls = list(n_df_1 = data.frame(var3_1 = c('x', 'x', 'x'),
                                         var3_2 = c(4, 4, 4))),
           name = c("two", "two", "two")))

Saya ingin menggabungkan semua daftar bersarang ini seperti yang dinyatakan di sini: Gabungkan Dua Daftar di R

Itu persis seperti yang saya inginkan jika saya melakukan ini:

merged <- mapply(c, ls[[1]], ls[[2]], SIMPLIFY = FALSE)

Masalahnya adalah, daftar utama (ls) tidak selalu hanya memiliki dua daftar bersarang. Bagaimana saya bisa membuat kode ini lebih modular?

Saya mencoba membuat vektor yang berisi semua indeks dari daftar bersarang:

sapply(seq_along(ls), function(x) paste0("ls[[", x, "]]"))

Yang keluaran ini:

[1] "ls[[1]]" "ls[[2]]"

Saya pikir saya bisa menghapus tanda kutip vektor karakter ini sehingga R melihatnya sebagai objek. Tapi saya tidak tahu bagaimana melakukannya (jika itu mungkin). Saya melihat eval rapi untuk ini, tetapi saya tidak tahu apakah ini cara untuk melakukannya.

Ada saran?

0
Artie16 7 Agustus 2019, 14:57

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan Reduce untuk melakukannya pada sejumlah abstrak elemen daftar, mis.

Reduce(function(...)Map(c, ...), l1) #Map = mapply(..., simplify = FALSE)

Yang memberikan,

$df
$df$var1_1
[1] 1 1 1

$df$var1_2
[1] a a a
Levels: a

$df$var1_1
[1] 1 1 1

$df$var1_2
[1] a a a
Levels: a


$ls
$ls$n_df_1
  var3_1 var3_2
1      x      4
2      x      4
3      x      4

$ls$n_df_1
  var3_1 var3_2
1      x      4
2      x      4
3      x      4


$name
[1] "one" "one" "one" "two" "two" "two"

DATA:

dput(l1)
list(one = list(df = structure(list(var1_1 = c(1, 1, 1), var1_2 = structure(c(1L, 
1L, 1L), .Label = "a", class = "factor")), class = "data.frame", row.names = c(NA, 
-3L)), ls = list(n_df_1 = structure(list(var3_1 = structure(c(1L, 
1L, 1L), .Label = "x", class = "factor"), var3_2 = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))), name = c("one", "one", "one")), two = list(df = structure(list(
    var1_1 = c(1, 1, 1), var1_2 = structure(c(1L, 1L, 1L), .Label = "a", class = "factor")), class = "data.frame", row.names = c(NA, 
-3L)), ls = list(n_df_1 = structure(list(var3_1 = structure(c(1L, 
1L, 1L), .Label = "x", class = "factor"), var3_2 = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))), name = c("two", "two", "two")))
3
Sotos 7 Agustus 2019, 12:14