在R中查找对象的组合

时间:2013-07-22 20:29:18

标签: r combinations

我有以下示例代码:

library(caTools)
sample1 = rnorm(20)
sample2 = rnorm(30)
sample3 = rnorm(40)
# could be more samples

args = list(sample1, sample2, sample3) # could be more

> combs(c(args), k=2)
     [,1]       [,2]      
[1,] Numeric,20 Numeric,30
[2,] Numeric,20 Numeric,40
[3,] Numeric,30 Numeric,40

然而,这不是所期望的。我想提供combs输入,该输入应该与:

相同
> combs(c("sample1","sample2", "sample3"),k=2)
     [,1]      [,2]     
[1,] "sample1" "sample2"
[2,] "sample1" "sample3"
[3,] "sample2" "sample3"

从那里我想使用get逐行提取每个sampleX对象的向量。

如何在不对“sample1”,“sample2”等进行硬编码的情况下执行此操作,以便我可以提供与送入的样本一样多的数据?

3 个答案:

答案 0 :(得分:2)

来自library(gtools)

combinations(3,2,c("sample1","sample2", "sample3"))

结果:

     [,1]      [,2]     
[1,] "sample1" "sample2"
[2,] "sample1" "sample3"
[3,] "sample2" "sample3"

如果这些对象是列表的命名元素,则可以获得相同的结果:

tmp <- list(sample1=1:3,sample2=4:6,sample3=7:9)
combinations(3,2,names(tmp))

或者,如果这些对象都在一个环境中:

tmp <- new.env()
tmp$sample1 <- 1:3
tmp$sample2 <- 4:6
tmp$sample3 <- 7:9
combinations(3,2,objects(tmp))

答案 1 :(得分:1)

这个怎么样?我使用简化数据作为说明性示例。

修改

感谢 @GSee 推荐这种方法的两项改进[请参阅评论]。

这不是我想要做的事情,但是我们在全局环境中的所有对象的名称上使用lspattern参数来返回适合的对象的名称模式,即在对象名称中包含"sample"的所有对象 - 所以要小心 - 然后使用list将它们粘贴到mget中。

然后,我们使用combn获取列表元素的组合,并使用匿名函数使用expand.grid组合列表对的所有元素。如果您想将此列为两列data.frame,则可以同时使用do.callrbind返回的列表:

sample1 <- 1:2
sample2 <- 3:4
sample3 <- 5:6

args <-mget( ls( pattern = "^sample\\d+") , env = .GlobalEnv )

res <- combn( length(args) , 2 , FUN = function(x) expand.grid(args[[x[1]]] , args[[x[2]]]) , simplify = FALSE )

do.call( rbind , res )
   Var1 Var2
1     1    3
2     2    3
3     1    4
4     2    4
5     1    5
6     2    5
7     1    6
8     2    6
9     3    5
10    4    5
11    3    6
12    4    6

答案 2 :(得分:0)

这是一种方法

# put samples in separate structure, for instance a list
samples <- list(s1=rnorm(20), s2=rnorm(30), s3=rnorm(40))     

cmb <- t(combn(names(samples),m=2))
apply(cmb,1,FUN=function(x) list(samples[[x[[1]]]], samples[[x[[2]]]]))