R按分组跨行拼接内容并保留发言序列的实现方法
实现方法
核心逻辑
你之前的方法问题出在直接按speaker全局分组,没有区分同一个说话人被其他说话人打断的不连续发言块。我们可以先给每组dyad内的连续相同发言块生成唯一标识,再按块拼接文本即可适配任意长度的连续发言场景。
dplyr 实现代码
library(dplyr) result <- dat %>% # 按dyad分组处理 group_by(dyad) %>% # 生成连续发言块ID:每次说话人变化时ID+1 mutate(block_id = cumsum(speaker != lag(speaker, default = first(speaker)))) %>% # 按dyad、块ID、speaker分组,拼接同一块内的文本 group_by(dyad, block_id, speaker) %>% summarise(text = paste(text, collapse = ". "), .groups = "drop") %>% # 去掉不需要的block_id列,调整输出顺序 select(dyad, speaker, text)
运行后输出结果和要求完全匹配:
print(result) # # A tibble: 6 × 3 # dyad speaker text # <dbl> <chr> <chr> # 1 1 John Let's play. We're wasting time. Let's make a record! # 2 1 Paul Let's work it out first # 3 1 John Why? # 4 2 George It goes like this # 5 2 Ringo Hold on. Have to tighten my snare # 6 2 George Ready?
可选:data.table 实现(性能更优,适合超大对话数据集)
library(data.table) setDT(dat) result <- dat[, block_id := cumsum(speaker != shift(speaker, fill = first(speaker))), by = dyad ][, .(text = paste(text, collapse = ". ")), by = .(dyad, block_id, speaker) ][, block_id := NULL][]
内容的提问来源于stack exchange,提问作者BBJonz
相关产品推荐
相关产品推荐

