Мы можем сгруппировать по 'id', использовать combn
, чтобы получить попарные комбинации 'word', и unnest
вывод
library(dplyr)
df1 %>%
group_by(id) %>%
summarise(out = list(combn(word, 2, FUN = function(x)
tibble(word1 = x[1], word2 = x[2]), simplify = FALSE))) %>%
unnest %>%
unnest
# A tibble: 12 x 3
# id word1 word2
# <int> <fct> <fct>
# 1 1 apple pear
# 2 1 apple orange
# 3 1 apple banana
# 4 1 pear orange
# 5 1 pear banana
# 6 1 orange banana
# 7 2 apple watermellon
# 8 2 apple orange
# 9 2 apple grape
#10 2 watermellon orange
#11 2 watermellon grape
#12 2 orange grape
Или с data.table
library(data.table)
setDT(df1)[, as.data.frame(do.call(rbind, combn(as.character(word),
2, simplify = FALSE))), by = id]
ПРИМЕЧАНИЕ. В этом случае используется combn
, который эффективен только при выборе необходимых комбинаций и без каких-либо объединений
Данные
df1 <- data.frame(id = rep(1:2, each=4),
word = c('apple', 'pear', 'orange', 'banana',
'apple', 'watermellon','orange', 'grape') )