R:具有多个标题的列表-如何按标题拆分(每个标题的行数不等)
Posted
技术标签:
【中文标题】R:具有多个标题的列表-如何按标题拆分(每个标题的行数不等)【英文标题】:R: List with multiple headings - How to split by heading (unequal lines per heading) 【发布时间】:2020-11-19 11:51:21 【问题描述】:我有一个看起来像这样的大文件:
Heading1
1 ABC
2 DEF
Heading2
1 GHI
2 JKL
3 MNO
Heading3
1 PQR
2 STU
标题始终具有相同的模式,但每个标题下方的条目不同(条目数量不同,没有共同的模式,字母/单词的数量不同)。
我想将一个列表拆分为多个列表,即每个标题都有一个新列表。如果有人能指出正确的方向来解决这个问题,那就太好了。
干杯!
编辑:忘记包含如何将每个新列表保存为文件名 = 标题的单独文件?
最终解决方案,感谢@Nate
## input
test <- list("Heading1", "1 ABC", "2 DEF", "Heading2", "1 GHI", "2 JKL", "3 MNO", "Heading3", "1 PQR", "2 STU")
## split list into list of lists
header_positions <- grepl("^Heading", test)
grouping_index <- cumsum(header_positions)
li <- split(test[!header_positions], grouping_index[!header_positions])
setNames(li, test[header_positions]) # Yes to fancy names ;)
## save each list
for(n in names(li))
writeLines(unlist(li[[n]]), paste0("heading ",n))
【问题讨论】:
您能否使用 dput()、dump() 或 structure() 提供可重现的数据样本? > dput(test) list("Heading1", "1 ABC", "2 DEF", "Heading2", "1 GHI", "2 JKL", "3 MNO", "Heading3 ", "1 PQR", "2 STU") dput(test) 之后应该有换行符...... 感谢观看,非常感谢! 不是您要求的确切内容,但您可以从“SOfun”查看read.mtable
。你可以做library(SOfun); read.mtable("test.txt", "Heading")
。
【参考方案1】:
这就是我会做的:
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"))
这是遍历列表名称的另一种有用模式,因此您可以直接访问名称(对于文件名)并使用它们来索引列表(对于文件内容)。
【讨论】:
感谢您将我指向 grepl 和 cumsum,这个解决方案非常清晰,非常感谢! sooo.... 我认为将每个列表保存为带有 filename = header 的单独文件肯定会很容易。但是,怎么做?我编辑了原始问题:) 我不认为你有一个列表,听起来更像是一个数据框,你要拆分的原始文件格式是什么? 普通的旧 txt。这真的很烦人,看起来像例子,只是更长:( 知道了,不用担心。前导数字是否表示为 rowID?【参考方案2】:你可以试试这个吗?
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])
【讨论】:
以上是关于R:具有多个标题的列表-如何按标题拆分(每个标题的行数不等)的主要内容,如果未能解决你的问题,请参考以下文章