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:具有多个标题的列表-如何按标题拆分(每个标题的行数不等)的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中拆分具有多个分隔符的字符串? [复制]

按数据库拆分具有多个数据库的 mysqldump 文件

什么时候将一个Vue组件拆分成多个组件(子组件)

在每个谓词 scala 处将字符串列表拆分为多个列表

如何从 R 中的数据帧创建具有多个参数的函数列表?

如何将每个 x 个元素拆分一个列表并将这些 x 个元素添加到一个新列表中?