Создать комбинацию всех переменных в группе - PullRequest
1 голос
/ 01 апреля 2020

У меня есть следующий фрейм данных

group    x    y
a        1    2
a        3    1
b        1    3
c        1    1
c        2    3

Я хочу иметь возможность генерировать все комбинации столбцов x и y внутри группы, например

group    xy
a        1-2
a        1-1
a        3-2
a        3-1
b        1-3
c        1-1
c        1-3
c        2-1
c        2-3

I ' я пытался использовать следующий код, но кажется, что функция group_by работает не так, как ожидалось

library(dplyr)
library(tidyr)
combn <- df %>%
group_by(group) %>%
expand(x, y)

Мои текущие результаты вместо этого дают мне все комбинации всех трех столбцов

head(combn)

group    x    y
a        1    1
a        1    2
a        1    3
a        2    1
a        2    2
a        2    3

Вывод:

structure(list(group = structure(c(1L, 1L, 2L, 3L, 3L), .Label = c("a", 
"b", "c"), class = "factor"), x = structure(c(1L, 3L, 1L, 1L, 
2L), .Label = c("1", "2", "3"), class = "factor"), y = structure(c(2L, 
1L, 3L, 1L, 3L), .Label = c("1", "2", "3"), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

1 Ответ

0 голосов
/ 01 апреля 2020

Вы можете использовать crossing из purrr для создания комбинаций в группе, а затем unnest для создания их в виде отдельных строк.

library(dplyr)

df1 <- df %>%
        group_by(group) %>%
        summarise(xy = list(crossing(x, y))) %>%
        tidyr::unnest(xy)
df1

#  group     a     b
#  <fct> <int> <int>
#1 a         1     2
#2 a         3     2
#3 a         1     1
#4 a         3     1
#5 b         1     3
#6 c         1     1
#7 c         2     1
#8 c         1     3
#9 c         2     3

Если вы хотите объединить два столбца, вы можете использовать unite:

tidyr::unite(df1, xy, a, b, sep = "-")

#   group xy   
#  <fct> <chr>
#1 a     1-2  
#2 a     3-2  
#3 a     1-1  
#4 a     3-1  
#5 b     1-3  
#6 c     1-1  
#7 c     2-1  
#8 c     1-3  
#9 c     2-3  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...