[英]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.