2015-12-16 4 views
0

У меня есть кадр данных, который выглядит как этотВыбор комбинации с фиксированной колонке в R

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

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

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" ) 
+1

Пожалуйста, объясните логику колонке "см" более подробно –

+0

я предполагаю, что это вы должны получить результат 'библиотека (data.table); setDT (d1) [, {tmp <- combn (bb, 2); (bb = tmp [1,], cc = tmp [2,])}, by = aa] '(на основе комментариев @Ananda Mahto – akrun

ответ

4

Используя щедрые комментарии @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 
3

Использование 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 
+0

Thanx @jeremycg, я использовал ваше решение. – user2575429

2

только основа Р.

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 
+0

Я также подумал о аналогичном решении также, но спасибо за ответ. – user2575429

Смежные вопросы