[問題] data.frame依欄位順序轉成樹狀lists

看板R_Language作者時間8年前 (2017/11/17 10:58), 8年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
程式諮詢(我想用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
文章代碼(AID): #1Q3b1SUB (R_Language)
文章代碼(AID): #1Q3b1SUB (R_Language)