[問題] data.frame依欄位順序轉成樹狀lists
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[問題敘述]:
想得到依欄位展開的樹狀結構list,且在leaf nodes 保留 names of leaf nodes
嘗試了幾次沒有得到很好的結果,以下是最接近的方式,想請教~
library(data.table)
library(magrittr)
dt <- fread('A B C D
a1 b1 NA NA
a2 b2 cx1 NA
a2 b2 cx1 dxx
a2 b2 cx2 NA
a3 b3 cx3 dx1
a3 b3 cx3 dx2
a4 b4 cx4 dx3')
out <- dt %>% split(.$A) %>%
lapply(function(x)
lapply(split(x, x$B), function(y)
lapply(split(y, y$C), function(z) {
sapply(z$D, function(u) {
if (is.na(u)) return(names(u))
list(u)})
})))
out
#================以下輸出結果
$a1
$a1$b1
named list() #這是錯的結果,想得到"b1"
$a2
$a2$b2
$a2$b2$cx1
$a2$b2$cx1$<NA> #這是錯的結果 到$cx1 即停止
NULL ##這是錯的結果 ,想得到"cx1"
$a2$b2$cx1$dxx
$a2$b2$cx1$dxx[[1]]
[1] "dxx" ##這是對的結果,留下name of leaf node
$a2$b2$cx2
$a2$b2$cx2$<NA> #這是錯的結果 到$cx2 即停止
NULL #這是錯的結果 ,想得到"cx2"
$a3
$a3$b3
$a3$b3$cx3
$a3$b3$cx3$dx1
[1] "dx1" ##這是對的結果
$a3$b3$cx3$dx2
[1] "dx2" ##這是對的結果
$a4
$a4$b4
$a4$b4$cx4
$a4$b4$cx4$dx3
[1] "dx3" ##這是對的結果
如上結果,我想得到依欄位ABCD 展開的樹狀結構list,所以用了split
可以正確地依階層順序展開 ($A -> $B -> $C -> $D)
而且想在leaf nodes 保留 names of leaf nodes
比如 $a3$b3$cx3$dx1 [1] "dx1" 這是對的結果
但 像後面有NA 的node 在 split 時就會被拋棄,因此我得不到node名
我希望得到
$a1$b1
[1] "b1"
$a2$b2$cx1
[1] "cx1"
$a2$b2$cx2
[1] "cx2"
不知道有無解法?謝謝~~
(附註,上面a1, b1, c1 字母和數字均為範例無意義,真實資料中為任意字串,請勿依數
字規則來當作程式一部分,僅是舉例)
※ 編輯: cywhale (140.112.65.48), 11/17/2017 11:28:28
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章