r - 如何从 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
解决方案
我的理解是,您想迭代地删除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 包(v0.3.0)于 2020-08-25 创建
推荐阅读
- php - php 尝试使用函数 exec() 启动本地程序
- microsoft-graph-api - Microsoft Graph API - 如何找出个人驱动器中更改的文件?
- ansible - Ansible:如何处理当前用户没有读取权限的文件(模式`0o600`)?
- angular - 使用ngFor时如何为cdkDropListConnectedTo设置Angular Material cdkDropList #name
- postgresql - 如何将表格的内容直接插入到另一个表格中?
- python - Shapley 值:解释 LSTM 预测时的维度问题
- arrays - MongoDB:如何计算两个对象内部的数组中的元素?
- javascript - 我的带有套接字 io 的烧瓶应用程序不允许使用 405 方法
- c# - 我可以将格式为 Mddyyy 的字符串转换为日期时间对象 c# 核心
- javascript - 在 Chrome 扩展内容脚本中注入 Popper.js