这个问题是基于我先前关于Splitting and grouping plain text (grouping text by chapter in dataframe)?的问题
在Shree的帮助下,我能够清理大部分文档!能够从列表中创建两列-第一列是章节编号,第二列是属于该章节的文本,但是我遇到了一些混乱的文本。
这是我的数据的最坏情况示例:
x
1 Chapter 1.
2 Chapter one text.
3 Chapter one text. Chapter 2. Chapter two text.
4 Chapter two text.
5 Chapter 3.
6 Chapter three text.
7 Chapter three text.
8 Chapter 4. Chapter four text
9 Chapter four text.
df <- structure(list(x = c("Chapter 1. ", "Chapter one text. ", "Chapter one text. Chapter 2. Chapter two text. ",
"Chapter two text. ", "Chapter 3. ", "Chapter three text. ", "Chapter three text. ",
"Chapter 4. Chapter four text ","Chapter four text. ")),
.Names = "x", class = "data.frame", row.names = c(NA, -9L))
我需要像这样构造它(章号,然后按ID顺序为该章的章文本),以便可以应用上一篇文章中的函数并将其干净地拆分:
x
1 Chapter 1.
2 Chapter one text.
3 Chapter one text.
4 Chapter 2.
5 Chapter two text.
6 Chapter two text.
7 Chapter 3.
8 Chapter three text.
9 Chapter three text.
10 Chapter 4.
11 Chapter four text
12 Chapter four text.
这似乎是一个简单的问题,我可以使用正则表达式将字符串拆分为寻找章节#(“第[0-9]章”),然后使用类似的逻辑将其再次拆分,以将章节和文本分成单独的行。但是,在尝试使用str_split
,gsub
,separate_rows
函数进行多次尝试后,我陷入了困境。
感谢您的帮助。
答案 0 :(得分:1)
我们可以使用separate_rows
,方法是在.
后面的空格处进行拆分(这里,我们使用了正则表达式环视符号来匹配点后的空格(\\s
)。
library(tidyverse)
df %>%
separate_rows(x, sep="(?<=[.])\\s") %>%
filter(x!='')
# x
#1 Chapter 1.
#2 Chapter one text.
#3 Chapter one text.
#4 Chapter 2.
#5 Chapter two text.
#6 Chapter two text.
#7 Chapter 3.
#8 Chapter three text.
#9 Chapter three text.
#10 Chapter 4.
#11 Chapter four text
#12 Chapter four text.