Вот подход tidyverse
, который также заимствует rleid
из пакета data.table
:
library(tidyverse)
df <-
structure(list(id = c(123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 123L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L, 789L),
word = structure(c(8L, 9L, 2L, 21L, 7L, 16L, 21L, 1L, 10L, 3L, 5L, 14L, 6L, 15L, 20L, 11L, 17L, 12L, 18L, 11L, 13L, 12L, 15L, 16L, 21L, 6L, 4L, 19L),
.Label = c("Anything", "are", "can", "contacting", "do", "for", "good", "hi", "how", "I", "is", "issue", "no", "nothing", "now", "thank", "the", "there", "us", "what", "you"), class = "factor"),
spk = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA, -28L))
df %>%
mutate(spk_num = data.table::rleid(spk)) %>%
mutate(word = as.character(word)) %>%
group_by(id, spk, spk_num) %>%
nest() %>%
mutate(words = map(data, unlist),
words = map_chr(words, paste, collapse = " "))
# A tibble: 7 x 5
id spk spk_num data words
<int> <int> <int> <list> <chr>
1 123 1 1 <tibble [4 x 1]> hi how are you
2 123 2 2 <tibble [3 x 1]> good thank you
3 123 1 3 <tibble [4 x 1]> Anything I can do
4 123 2 4 <tibble [3 x 1]> nothing for now
5 789 1 5 <tibble [4 x 1]> what is the issue
6 789 2 6 <tibble [5 x 1]> there is no issue now
7 789 1 7 <tibble [5 x 1]> thank you for contacting us
Обзор: Во-первых, создайте столбец spk_num
, так как желаемый результат желает различать колонки в пределах одного и того же идентификатора. Далее group_by
все и nest
данные. Наконец, мы сопоставим paste
со спадом по всему выводу, но сначала вам нужно будет отменить выбор слова data.