如何从R中按层次结构组织的数据中筛选非顺序标识符



我正在使用R.从一个大型文档中提取该节中的节名和引用

我的结果目前看起来像:

df<-data.frame("sectname"=c("1","1.1","1.2","1.1.1","1.2","3","2","2.1"), "ref"=c("FALSE","2.1", "3", "FALSE","FALSE","FALSE","FALSE", "FALSE"))

然而,在层次结构[3,6]中不连续的扇区名称实际上是属于上面一行的引用。

有没有一种功能性的方法来捕捉这些并粘贴到ref[i-1]中?

期望输出:

<sectname> <ref>
1          FALSE
1.1        c("2.1","1.2","3")
1.1.1      FALSE
1.2        3
2          FALSE
2.1        FALSE

我的理解是,您希望迭代地删除sectname中破坏其顺序的元素,并将它们粘贴到ref中不为FALSE的元素上。

这可以通过while循环来实现。唯一的问题是ref最终比sectname长,因为您将sectname缩短,但保留了ref的长度。因此,它们不能保留为数据帧列。

从数据结构来看,我怀疑这些数据并不自然地属于行。以下是如何进行转换。我需要将结果作为向量,因为不清楚它们应该属于哪种数据结构

extras <- character()
sectname <- df$sectname
ref <- df$ref
while(TRUE)
{
vals <- which(diff(order(sectname)) != 1)
if(length(vals) == 0) break
i <- vals[1] + 1
extras <- c(extras, sectname[i])
sectname <- sectname[-i]
}
ref[which(ref != "FALSE")] <- paste(ref[which(ref != "FALSE")], extras)
ref 
#> [1] "FALSE"   "2.1 1.2" "3 3"     "FALSE"   "FALSE"   "FALSE"   "FALSE"  
#> [8] "FALSE"
sectname
#> [1] "1"     "1.1"   "1.1.1" "1.2"   "2"     "2.1"

由reprex包于2020-08-25创建(v0.3.0(

最新更新