我需要將任意嵌套的串列展平為資料框,并將鍵/索引的路徑保留在一列中,同時將底層的每個元素提取到單獨的行。
考慮以下串列:
lst <- list(
animals = list(
lamas = c("brown", "white"),
primates = list(
humans = c("asia", "europe"),
apes = c("good", "fast", "angry")
)
),
objects = c("expensive", "cheap"),
plants = NULL
)
的結果flatten_list(lst, delimiter="_")應如下所示:
data.frame(
path = c("animals_lamas", "animals_lamas", "animals_primates_humans", "animals_primates_humans", "animals_primates_apes", "animals_primates_apes", "animals_primates_apes", "objects", "objects", "plants"),
value = c("brown", "white", "asia", "europe", "good", "fast", "angry", "expensive", "cheap", NA)
)
我很驚訝我無法使用 tidyr 或 data.tables 實作這一目標。我需要一個遞回函式,還是有一些開箱即用的解決方案?贊賞!
編輯:akrun提供的解決方案適用于原始資料。我意識到當元素NULL處于底層時存在問題,因此重新表述了問題。
EDIT2我目前的解決方法是在應用akrunNULL解決方案之前遞回替換,使用此處提供的函式[再次由 akrun ;) ]。NA
uj5u.com熱心網友回復:
一個可以處理的解決方案NULL,基于rrapply:
library(tidyverse)
library(rrapply)
rrapply(lst, f = \(x) if (is.null(x)) NA else x, how = "melt") %>%
unnest(value) %>% unite(path, L1:L3, na.rm = T)
#> # A tibble: 10 × 2
#> path value
#> <chr> <chr>
#> 1 animals_lamas brown
#> 2 animals_lamas white
#> 3 animals_primates_humans asia
#> 4 animals_primates_humans europe
#> 5 animals_primates_apes good
#> 6 animals_primates_apes fast
#> 7 animals_primates_apes angry
#> 8 objects expensive
#> 9 objects cheap
#> 10 plants <NA>
uj5u.com熱心網友回復:
可以melt通過進入 data.frame 然后unite鍵列來完成
library(reshape2)
library(dplyr)
library(tidyr)
out2 <- melt(lst) %>%
unite(path, L1:L3, sep = "_", na.rm = TRUE) %>%
select(path, value)
-檢查OP的輸出
> all.equal(out, out2)
[1] TRUE
我們也可以通過unlist和stack從base R
stack(unlist(lapply(lst, \(x) if(is.null(x)) NA_character_ else x)))[2:1]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475122.html
