找到属性变量的组合对

时间:2013-05-24 03:03:40

标签: r combinations

我四处寻找解决方案但找不到合适的解决方案。

假设:

a<-c('a','b','c')
b<-c('d','e','f')
d<-c('g','h')

作为一个更大的集合的玩具子集,我希望能够找到它们之间的唯一对 属性(向量)集。如果我使用

combn(c(a,b,d),2)

它将返回所有属性元素的所有成对组合。 例如

combn(c(a,b,d),2)

返回c(a,b)c(a,d)c(a,d)c(a,e)......

但我只想要属性之间的元素对。所以我不会看到a,b或a,c但是 a,d a,e a,f b,d b,e,b,f等...

我可以使用expand.grid(a,b,d)来完成它。

   Var1 Var2 Var3
1     a    d    g
2     b    d    g
3     c    d    g
4     a    e    g
5     b    e    g
6     c    e    g
7     a    f    g
8     b    f    g
9     c    f    g
10    a    d    h
11    b    d    h
12    c    d    h
13    a    e    h
14    b    e    h
15    c    e    h
16    a    f    h
17    b    f    h
18    c    f    h

但现在我有一组n-col维组合。有没有办法限制 它只是属性元素对,例如combn(x,2)

主要目标是找到所有属性对之间唯一的元素成对组合列表,但我不想要元素的组合 在同一个属性列中,因为它在我的应用程序中是多余的。

2 个答案:

答案 0 :(得分:2)

在网格中的每一行中组合对,然后过滤以获得唯一条目,我们有:

unique(do.call(c, apply(expand.grid(a,b,d), 1, combn, m=2, simplify=FALSE)))

返回组合列表:

> L <- unique(do.call(c, apply(expand.grid(a,b,d), 1, combn, m=2, simplify=FALSE)))[1:5]
> length(L) ## 21
> L
## [[1]]
## Var1 Var2 
##  "a"  "d" 
## 
## [[2]]
## Var1 Var3 
##  "a"  "g" 
## 
## [[3]]
## Var2 Var3 
##  "d"  "g" 
## 
## [[4]]
## Var1 Var2 
##  "b"  "d" 
## 
## [[5]]
## Var1 Var3 
##  "b"  "g" 

答案 1 :(得分:1)

首先,创建一个列表,其中每个元素都是一对原始向量,例如list(a, b)

L <- list(a, b, d)
L.pairs <- combn(seq_along(L), 2, simplify = FALSE, FUN = function(i)L[i])

然后为这些对中的每一对运行expand.grid并将各个部分组合在一起:

do.call(rbind, lapply(L.pairs, expand.grid))
#    Var1 Var2
# 1     a    d
# 2     b    d
# 3     c    d
# [...]
# 19    d    h
# 20    e    h
# 21    f    h