Выбор комбинации с фиксированным столбцом в R

У меня есть кадр данных, который выглядит так

 aa   bb      
 --------
 a    1   
 a    2   
 a    3   
 b    4       
 b    5    
 b    1    

Я хочу, чтобы выше кадр данных имел пару элементов, выбранных из «bb», и выглядел как кадр ниже

 aa   bb   cc   
 -------------
 a    1    2   
 a    1    3   
 a    2    3   
 b    4    5  
 b    4    1   
 b    5    1   

R входной код

d1 <- read.table(header = TRUE, sep = ";", text = 
"aa;bb
 a;1   
 a;2   
 a;3   
 b;4       
 b;5    
 b;1"   )

person user2575429    schedule 16.12.2015    source источник
comment
Пожалуйста, объясните логику столбца cc более подробно   -  person talat    schedule 16.12.2015
comment
Я думаю, это должно дать вам результат library(data.table);setDT(d1)[,{tmp <- combn(bb,2); list(bb= tmp[1,], cc= tmp[2,]) } , by = aa] (на основе комментариев @Ananda Mahto   -  person akrun    schedule 16.12.2015


Ответы (3)


Используя щедрые комментарии @Ananda Mahto о combn, мы преобразуем «data.frame» в «data.table» (setDT(d1)), сгруппированные по «aa», мы получаем попарные комбинации «bb» (combn(bb,2)), извлекаем строки из него создать «bb» и «cc».

library(data.table)
setDT(d1)[,{tmp <- combn(bb,2)
           list(bb= tmp[1,], cc= tmp[2,]) } , by = aa]
#   aa bb cc
#1:  a  1  2
#2:  a  1  3
#3:  a  2  3
#4:  b  4  5
#5:  b  4  1
#6:  b  5  1
person akrun    schedule 16.12.2015

Использование dplyr:

library(dplyr)

d1 %>% group_by(aa) %>%
       do(data.frame(t(combn(.[["bb"]], 2))))

Source: local data frame [6 x 3]
Groups: aa [2]

                  aa    X1    X2
              (fctr) (dbl) (dbl)
1                  a     1     2
2                  a     1     3
3                  a     2     3
4                  b     4     5
5                  b     4     1
6                  b     5     1
person jeremycg    schedule 16.12.2015
comment
Спасибо @jeremycg, я использовал ваше решение. - person user2575429; 17.12.2015

Только база Р.

d2 <- t(do.call(cbind, tapply(d1$bb, d1$aa, function(x)combn(x, 2))))
rownames(d2) <- d1$aa
d2
#   [,1] [,2]
# a    1    2
# a    1    3
# a    2    3
# b    4    5
# b    4    1
# b    5    1
person Ven Yao    schedule 16.12.2015
comment
Я тоже думал о подобном решении, но спасибо за ответ. - person user2575429; 17.12.2015