【问题标题】:R: List with multiple headings - How to split by heading (unequal lines per heading)R:具有多个标题的列表-如何按标题拆分(每个标题的行数不等)
【发布时间】: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")

标签: r list split heading write


【解决方案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])

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2021-06-20
    • 2012-05-03
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多