在R语言中基于可变拆分词将文本列拆分为两列
基于可变拆分词拆分文本列的dplyr解决方案
首先给出原始数据框:
df <- data.frame(ID = c(1,2,3), text = c("A big basket of fruits having apples, green bananas, and peaches", "A small basket of fruits having green bananas, apples, and peaches", "A red colored basket of fruits having peaches, green bananas, and apples"), splitter = c("apples", "bananas", "peaches"))
方案一:严格按splitter列的可变词拆分
该方案完全遵循需求描述:以每行的splitter词为分隔点,拆分text为preamble(拆分词前内容)和body(拆分词后内容):
library(dplyr) library(stringr) df_processed <- df %>% rowwise() %>% mutate( # 按当前行的splitter字面匹配拆分文本,分成两部分 split_content = str_split_fixed(text, fixed(splitter), n = 2), # 提取preamble并去除首尾空格 preamble = str_trim(split_content[, 1]), # 提取body,去除开头可能存在的逗号和多余空格 body = str_trim(str_remove(split_content[, 2], "^,?\\s*")) ) %>% select(-split_content) %>% ungroup() # 输出preamble结果 df_processed$preamble # [1] "A big basket of fruits having" "A small basket of fruits having green" # [3] "A red colored basket of fruits having"
方案二:匹配你给出的预期preamble结果
如果实际需求是提取到"having"为止的内容(忽略拆分词前的修饰语),可以直接通过匹配关键词拆分:
df_processed <- df %>% mutate( preamble = str_trim(str_extract(text, ".+having")), body = str_trim(str_remove(text, ".+having\\s+")) ) # 输出preamble结果 df_processed$preamble # [1] "A big basket of fruits having" "A small basket of fruits having" # [3] "A red colored basket of fruits having"
关键说明
- 方案一中使用
rowwise()实现逐行处理,因为每行的拆分词是可变的,fixed(splitter)确保按字面匹配拆分词,避免正则特殊字符的干扰。 - 方案二是根据你给出的预期结果调整的,适用于需要固定保留到"having"部分的场景。
内容的提问来源于stack exchange,提问作者Samarth A
相关产品推荐
相关产品推荐

