R:包含多个标题的列表 - 如何按标题拆分(每个标题行不等)
R: List with multiple headings - How to split by heading (unequal lines per heading)
我有一个大文件,如下所示:
Heading1
1 ABC
2 DEF
Heading2
1 GHI
2 JKL
3 MNO
Heading3
1 PQR
2 STU
标题始终具有相同的模式,但每个标题下的条目不同 — 条目数量不同,没有共同的模式,字母数量不同 and/or 个单词。
我想将一个列表拆分为多个列表,即每个标题一个新列表。我该如何解决?
你能试试这个吗?
mylist = list("Heading1", "1 ABC", "2 DEF", "Heading2", "1 GHI", "2 JKL", "3 MNO", "Heading3", "1 PQR", "2 STU")
idx = unlist(lapply(mylist, function(x) as.numeric(regexpr("heading", x, ignore.case=T))))
idx[which(idx == -1)] = 0
idx = cumsum(idx)
myotherlist = vector("list", max(idx))
for (i in 1:length(mylist)) myotherlist[[idx[i]]] = append(myotherlist[[idx[i]]], mylist[i])
这就是我要做的:
header_positions <- grepl("^Heading", test)
header_positions
grouping_index <- cumsum(header_positions)
grouping_index
li <- split(test[!header_positions], grouping_index[!header_positions])
li
setNames(li, test[header_positions]) # if you want to have fancy names :)
我认为 cumsum(grepl(...))
模式对于这种列表拆分任务非常有用。
如果你想通过 writeLines()
写出来,你需要将列表元素转换为 character
向量 unlist()
:
for(n in names(li)) {
writeLines(unlist(li[[n]]), paste0(n, ".txt"))
}
这是迭代列表名称的另一种有用模式,因此您可以直接访问名称(对于文件名)并使用它们为列表编制索引(对于文件内容)。
我有一个大文件,如下所示:
Heading1
1 ABC
2 DEF
Heading2
1 GHI
2 JKL
3 MNO
Heading3
1 PQR
2 STU
标题始终具有相同的模式,但每个标题下的条目不同 — 条目数量不同,没有共同的模式,字母数量不同 and/or 个单词。
我想将一个列表拆分为多个列表,即每个标题一个新列表。我该如何解决?
你能试试这个吗?
mylist = list("Heading1", "1 ABC", "2 DEF", "Heading2", "1 GHI", "2 JKL", "3 MNO", "Heading3", "1 PQR", "2 STU")
idx = unlist(lapply(mylist, function(x) as.numeric(regexpr("heading", x, ignore.case=T))))
idx[which(idx == -1)] = 0
idx = cumsum(idx)
myotherlist = vector("list", max(idx))
for (i in 1:length(mylist)) myotherlist[[idx[i]]] = append(myotherlist[[idx[i]]], mylist[i])
这就是我要做的:
header_positions <- grepl("^Heading", test)
header_positions
grouping_index <- cumsum(header_positions)
grouping_index
li <- split(test[!header_positions], grouping_index[!header_positions])
li
setNames(li, test[header_positions]) # if you want to have fancy names :)
我认为 cumsum(grepl(...))
模式对于这种列表拆分任务非常有用。
如果你想通过 writeLines()
写出来,你需要将列表元素转换为 character
向量 unlist()
:
for(n in names(li)) {
writeLines(unlist(li[[n]]), paste0(n, ".txt"))
}
这是迭代列表名称的另一种有用模式,因此您可以直接访问名称(对于文件名)并使用它们为列表编制索引(对于文件内容)。