繁体   English   中英

如何在R中制作独特的向量组合?

[英]How to make a unique combination of vectors in R?

我有几个由三个名字组成的向量。 我想获得这些载体的所有独特的成对组合。 举个例子,有两个向量,我可以得到非唯一的组合

sham1 <- c('a', 'b')
sham2 <- c('d', 'e')
shams <- list(sham1, sham2) 
combinations <- apply(expand.grid(shams, shams),1, unname)

它给出了以下组合

> dput(combinations)
list(
list(c("a", "b"), c("a", "b")), 
list(c("d", "e"), c("a", "b")), 
list(c("a", "b"), c("d", "e")), 
list(c("d", "e"), c("d", "e"))
)

我尝试使用unique(combinations) ,但这给出了相同的结果。 我想得到的是

> dput(combinations)
list(
list(c("a", "b"), c("a", "b")), 
list(c("d", "e"), c("a", "b")), 
list(c("d", "e"), c("d", "e"))
)

因为已经有组合list(c("d", "e"), c("a", "b")) ,我不需要组合list(c("a", "b"), c("d", "e"))我怎样才能得到唯一的向量组合?

我也不确定你想要什么,但这个功能可能会有所帮助:

combn

这是一个简单的例子:

> combn(letters[1:4], 2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "c" 
[2,] "b"  "c"  "d"  "c"  "d"  "d" 

我不认为这是你想要的,但是如果你澄清或许我可以编辑以获得你想要的东西:

> sham1<-c('a','b')
> sham2<-c('d','e')
> combn(c(sham1,sham2),2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "a"  "b"  "b"  "d" 
[2,] "b"  "d"  "e"  "d"  "e"  "e" 
s <- seq(length(shams))
# get unique pairs of shams indexes, including each index with itself.
uniq.pairs <- unique(as.data.frame(t(apply(expand.grid(s, s), 1, sort))))
#   V1 V2
# 1  1  1
# 2  1  2
# 4  2  2
result <- apply(uniq.pairs, 1, function(x) shams[x])

combn可以获得组合(因此,唯一),但不是重复组合。 所以将它与那些给你重复的东西结合起来就可以了:

c(combn(shams, 2, simplify=FALSE), 
  lapply(shams, function(s) list(s,s)))

不知道你的例子在说什么。 如果您想要独特的成对组合:

strsplit(levels(interaction(sham1, sham2, sep="*")), "\\*")

我不明白你想要什么。 而且您似乎已从其他问题更改了所需的输出。
你希望你的两个列表嵌套在另一个列表中的列表中??? 一次就不简单了? 就像你有shams

dput(shams)
list(c("Sham1.r1", "Sham1.r2", "Sham1.r3"), c("Sham2.r1", "Sham2.r2", 
"Sham2.r3"))

要创建这样的嵌套列表,您可以使用:

combinations <- list(shams, "")
dput(combinations)
list(list(c("Sham1.r1", "Sham1.r2", "Sham1.r3"), c("Sham2.r1", "Sham2.r2", 
"Sham2.r3"), "")

虽然你说的不完全是......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM