R语言如何将数据框单条观测拆分为多条并匹配对应title标签
解决方法
核心思路
- 先对text列按换行符
\n拆分为长表,每行对应一条独立发言,原行对应的title会自动关联到拆分后的每一行 - 再从拆分后的单条发言里分别提取姓名和发言内容,你原有自定义的姓名匹配规则可以直接复用,只需要补全R字符串要求的转义符即可
完整可运行代码(tidyverse 写法,逻辑清晰易修改)
# 加载依赖包 library(tidyverse) # 原始数据 title <- c("title1","title2") text <- c("Mr.A.Speech1.\nMr.B.Speech2.\nMr.C.Speech3\n","Mrs.D.Speech4.\nMs.E.Speech5.\n") df<- data.frame(title, text) # 姓名匹配正则,注意R字符串里转义符要写双反斜杠 name_pattern <- "\\bM(?:rs?|s)\\.\\s[:upper:]{1,20}\\s?c?'?-?[:upper:]{1,20}\\s?o?f?\\s?|The\\sSPEAKER|The\\sPRESIDING\\s" # 处理逻辑 df_result <- df %>% # 按换行拆分text为长表,自动保留对应title separate_longer_delim(text, delim = "\n") %>% # 过滤换行结尾产生的空行 filter(text != "") %>% # 提取姓名、提取发言内容 mutate( Name = str_extract(text, name_pattern), Text = str_remove(text, name_pattern) ) %>% # 调整列顺序和列名匹配你要的输出格式 select(Title = title, Name, Text)
注:你给出的目标示例中第4、5行的Title标注有误,实际对应原始数据的title2,代码运行后会自动匹配为正确的title。
基础R实现方法(不用额外安装包)
# 拆分每行text,同时统计每行拆分出的发言条数 split_text <- strsplit(df$text, "\n") row_n <- sapply(split_text, length) # 生成和拆分后行数一一对应的title向量 rep_title <- rep(df$title, row_n) # 生成长表 df_long <- data.frame( Title = rep_title, text = unlist(split_text) ) # 过滤空行 df_long <- df_long[df_long$text != "", ] # 匹配提取姓名和内容,和上方tidyverse写法逻辑一致 name_pattern <- "\\bM(?:rs?|s)\\.\\s[:upper:]{1,20}\\s?c?'?-?[:upper:]{1,20}\\s?o?f?\\s?|The\\sSPEAKER|The\\sPRESIDING\\s" df_long$Name <- str_extract(df_long$text, name_pattern) df_long$Text <- str_remove(df_long$text, name_pattern) df_result <- df_long[, c("Title", "Name", "Text")]
内容的提问来源于stack exchange,提问作者Foulball
相关产品推荐
相关产品推荐

