程式谘询(我想用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