簡體   English   中英

R 列表中的unlist列表

[英]Unlist lists of lists in R

我寫了一個構建決策樹的 function。 output L是列表的列表,其中列表的每個“葉”是到達樹中相應葉的數據的子集。 例如,如果樹有 3 個葉子,那么 function 的 output 將是具有 3 個數據幀的嵌套列表L

List of 2
 $ left :'data.frame':  5 obs. of  3 variables:
  ..$ X1: num [1:5] 0.884 0.875 1.175 1.053 0.858
  ..$ X2: num [1:5] 0.996 0.884 0.995 1.029 1.006
  ..$ y : num [1:5] 1 1 1 1 1
 $ right:List of 2
  ..$ left :'data.frame':   5 obs. of  3 variables:
  .. ..$ X1: num [1:5] 2.03 1.93 2.07 2.02 2.06
  .. ..$ X2: num [1:5] 1.98 1.95 1.85 2.14 2.11
  .. ..$ y : num [1:5] 3 3 3 3 3
  ..$ right:'data.frame':   5 obs. of  3 variables:
  .. ..$ X1: num [1:5] 2.93 2.92 3.02 2.84 2.95
  .. ..$ X2: num [1:5] 2.98 3.06 2.91 3.03 2.89
  .. ..$ y : num [1:5] 2 2 2 2 2

我如何將這些 data.frames 組合成一個 data.frame 一般,即如何取消列出此列表?

這是一種遞歸方法。 它對你作為人類使用的東西應用了類似的邏輯。

flat <- list()
finder <- function(l) {
    for (element in l) {
        if (inherits(element, "data.frame")) {
            flat <<- c(flat, list(element))
        } else {
            finder(element)
        }
    }
    return(flat)
}

一旦你運行了上面的代碼,你可以用Reduce(rbind, finder(your_list))調用它

我不確定如何在不必使用<<-所以希望比我更有知識的人提供反饋。

假設列表的最大深度為 2(如示例所示,您可以使用 bind_rows() from dplyr綁定深度為 2 的節點的所有行,使用map_dfr() bind_rows() from 迭代所有頂級節點purrr 。在這兩種情況下,您都可以使用.id參數創建一個列來存儲葉和分支的名稱(或您想要調用它們的任何名稱)。

tree <- list(
  "left" = data.frame(
    X1 = c(0.884, 0.875, 1.175, 1.053, 0.858),
    X2 = c(0.996, 0.884, 0.995, 1.029, 1.006),
    y = 1
  ),
  "right" = list(
    "left" = data.frame(
      X1 = c(2.03, 1.93, 2.07, 2.02, 2.06),
      X2 = c(1.98, 1.95, 1.85, 2.14, 2.11),
      y = 3
    ),
    "right" = data.frame(
      X1 = c(2.93, 2.92, 3.02, 2.84, 2.95),
      X2 = c(2.98, 3.06, 2.91, 3.03, 2.89),
      y = 2
    )
  )
)

purrr::map_dfr(
  tree, 
  function (x) {
    if (is.data.frame(x)) {
      x
    } else {
      dplyr::bind_rows(x, .id = "leaf")
    }
  }
  , 
  .id = "branch"
)
#>    branch    X1    X2 y  leaf
#> 1    left 0.884 0.996 1  <NA>
#> 2    left 0.875 0.884 1  <NA>
#> 3    left 1.175 0.995 1  <NA>
#> 4    left 1.053 1.029 1  <NA>
#> 5    left 0.858 1.006 1  <NA>
#> 6   right 2.030 1.980 3  left
#> 7   right 1.930 1.950 3  left
#> 8   right 2.070 1.850 3  left
#> 9   right 2.020 2.140 3  left
#> 10  right 2.060 2.110 3  left
#> 11  right 2.930 2.980 2 right
#> 12  right 2.920 3.060 2 right
#> 13  right 3.020 2.910 2 right
#> 14  right 2.840 3.030 2 right
#> 15  right 2.950 2.890 2 right

reprex package (v2.0.1) 創建於 2022-04-19

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM