2

我四处寻找解决方案,但找不到确切的解决方案。

鉴于:

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,da,ea,fb,db,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)

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

4

2 回答 2

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" 
于 2013-05-24T03:12:13.100 回答
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
于 2013-05-24T04:15:36.547 回答