Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择与R中的固定列组合_R_Combinations_Combn - Fatal编程技术网

选择与R中的固定列组合

选择与R中的固定列组合,r,combinations,combn,R,Combinations,Combn,我有一个像这样的数据框 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

我有一个像这样的数据框

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

d1使用@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
库(data.table)

setDT(d1)[,{tmp使用
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
只有基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

d2请更详细地解释“cc”列后面的逻辑我想这应该会得到结果
library(data.table);setDT(d1)[,{tmp Thanx@jeremycg,我使用了你的解决方案。我也想到了类似的解决方案,但答案是Thanx。