首页 > 解决方案 > 如何从 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] 中不连续的教派名称实际上是属于上述行的 refs。

有没有一种功能性的方法可以捕获这些并粘贴到 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

标签: rhierarchy

解决方案


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

这可以通过while循环来实现。唯一的问题是ref最终会比sectnamesectname缩短但保留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 包(v0.3.0)于 2020-08-25 创建


推荐阅读