Как заставить переменные элементы соединяться друг с другом в каждой группе в r - PullRequest
1 голос
/ 07 июля 2019

У меня есть датафрейм, как показано ниже:

data.frame(id = rep(1:2, each=4), 
           word = c('apple', 'pear', 'orange', 'banana',
                    'apple', 'watermellon','orange', 'grape') )

Мне нужно преобразовать данные в форму ниже. Необходимо объединить все слова в столбце слов в каждой группе (id) и создать два столбца word1 и word2.

id    word1      word2
1     apple      pear
1     apple      orange
1     apple      banana
1     pear       orange
1     pear       banana
1     orange     banana
2     apple      watermellon
2     apple      Orange

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Вот решение dplyr, соединяющее фрейм данных и удаляющее ненужные пары -

df %>% 
  inner_join(df, by = "id") %>% 
  filter(
    word.x != word.y &
    !duplicated(t(apply(., 1, sort)))
  ) %>% 
  rename(word1 = word.x, word2 = word.y)

   id       word1       word2
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
1 голос
/ 07 июля 2019

Мы можем сгруппировать по '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') )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...