1

我有以下示例代码:

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”等的情况下做到这一点,以便我可以拥有尽可能多的样本?

4

3 回答 3

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))
于 2013-07-22T20:39:37.280 回答
1

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

编辑

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

这不是我愿意做的事情,但我们使用lspattern参数在您的全局环境中的所有对象的名称上返回符合模式的名称,即包含"sample"在对象名称中的所有对象 - 所以是小心-然后将它们粘在listusing 中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
于 2013-07-22T22:03:53.570 回答
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]]]]))
于 2013-07-22T20:40:41.707 回答