0

我有一个看起来像这样的数据框

 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"   )
4

3 回答 3

4

使用@Ananda Mahtocombn关于创建“bb”和“cc”。setDT(d1)combn(bb,2)

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
于 2015-12-16T15:31:01.677 回答
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
于 2015-12-16T15:43:17.647 回答
2

只有基数 R。

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
于 2015-12-16T16:52:27.777 回答