我有以下长格式数据框,其中两列包含嵌套的父子层次结构:
parent,child,child_level
d ,sf ,x
d ,st ,x
d ,s0 ,x
sf ,gr4 ,l
sf ,gr3 ,l
st ,grd ,l
st ,gr9 ,l
s0 ,n7 ,l
s0 ,b12 ,l
grd ,nyvc ,b
gr3 ,trub2,b
b12 ,ngb2 ,b
b12 ,ggb8 ,b
nyvc ,xtr2d,i
trub2 ,xtuD ,i
gr4 ,stab3,i
gr9 ,ubc8 ,i
n7 ,ubc2 ,i
ggb8 ,drik2,i
我的目标是将父列和子列取消嵌套为宽格式。列名应与“子级”列中的相应级别相对应:
,x ,l ,b ,i
d,sf,gr4,NA ,stab3
d,sf,gr3,trub2,xtuD
d,st,grd,nyvc ,xtr2d
d,st,gr9,NA ,ubc8
d,s0,n7 ,NA ,ubc2
d,s0,b12,ngb2 ,NA
d,s0,b12,ggb8 ,drik2
没有表示顺序或级别等级的其他信息,这些信息仅从子列和父列中出现。此外,并非输出表的所有行都将包含所有层次结构级别-这些级别应使用NA填充
EDIT1(澄清):R或Python解决方案可以工作,因此我提供了一个通用输入表(例如,作为csv阅读)。另外,下表是手工制作的——我不知道如何通过编程实现
EDIT2:行没有顺序,即子级可以是任意顺序,因此必须采用某种递归方法
如果没有更多的信息,我通常会如何处理这个问题。我展示了一个
tidyverse
解决方案,但这当然也可以在baser中实现输入如下所示:
它将输出以下内容:
更新的答案
我现在有一种方法,只要你知道后代的顺序,也就是我们需要对
child_level
向量排序的顺序,它就可以工作。如果你不知道,我们应该能够计算订单,但现在我假设它是已知的该方法基于:
parent_level
parent_level
和child_level
嵌套数据帧purrr::accumulate2
或purrr::reduce2
一起使用,该函数使用left_join
连接行中的所有data.frames,如果再次连接现有列,则将相应的列合并为一个列在应用此自定义
join_merge
函数之前:child_level
)parent
和child
被替换为parent_level
和child_level
的值parent_level
和child_level
组合成一个名为arg_ls
的向量,该向量作为.y
参数传递给accumulate2
(或者reduce2
)我希望这对你的真实数据有效
由reprex package(v0.3.0)于2020-12-22创建
相关问题 更多 >
编程相关推荐