我四处寻找解决方案但找不到合适的解决方案。
假设:
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)
主要目标是找到所有属性对之间唯一的元素成对组合列表,但我不想要元素的组合 在同一个属性列中,因为它在我的应用程序中是多余的。
答案 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