如何在R语言中基于另一列将单词分组为字符串?
在R中高效实现NER标签的文本拼接
针对你的需求,完全可以通过向量化分组聚合实现,避免低效的循环,处理大数据集也能保持高效。以下是两种主流方法(基于你的data.table数据集,也提供tidyverse方案):
方法一:使用data.table(推荐,适合大数据集)
利用data.table的高效分组能力,结合cumsum生成分组ID,再拼接文本并处理特殊符号:
library(data.table) # 为每个B开头的实体生成唯一分组ID mydat[, group := cumsum(Tag == "B")] # 分组拼接单词,同时处理"-"符号的格式 mystrings <- mydat[, gsub(" - ", "-", paste(Word, collapse = " ")), by = group]$V1 # 查看结果 mystrings
输出结果与你的期望完全一致:
[1] "Acanthosis nigricans" "AN" "skin condition" [4] "hyperkeratosis of the skin" "AN" "obesity" [7] "drug-induced AN" "AN" "malignant AN"
方法二:使用dplyr(tidyverse风格)
如果你习惯tidyverse语法,也可以用dplyr实现相同逻辑:
library(dplyr) mystrings <- mydat %>% # 生成分组ID mutate(group = cumsum(Tag == "B")) %>% # 按分组聚合拼接文本 group_by(group) %>% summarise(text = gsub(" - ", "-", paste(Word, collapse = " "))) %>% # 提取结果向量 pull(text)
核心逻辑说明
- 分组ID生成:
cumsum(Tag == "B")会在每次遇到Tag="B"时累加计数,自动将每个实体(B开头+后续所有I标签的单词)划分为同一个分组,这是实现高效聚合的关键。 - 文本拼接与格式处理:用
paste(..., collapse=" ")将分组内的单词拼接成字符串,再通过gsub(" - ", "-", ...)把单独的-符号转换为连字符,符合你期望的drug-induced格式。
这种方法完全基于向量化操作,避免了逐行循环,在大数据集上的效率远高于手动遍历。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

