我有以下示例代码:
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”等进行硬编码的情况下执行此操作,以便我可以提供与送入的样本一样多的数据?
答案 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 推荐这种方法的两项改进[请参阅评论]。
这不是我想要做的事情,但是我们在全局环境中的所有对象的名称上使用ls
和pattern
参数来返回适合的对象的名称模式,即在对象名称中包含"sample"
的所有对象 - 所以要小心 - 然后使用list
将它们粘贴到mget
中。
然后,我们使用combn
获取列表元素的组合,并使用匿名函数使用expand.grid
组合列表对的所有元素。如果您想将此列为两列data.frame
,则可以同时使用do.call
和rbind
返回的列表:
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]]]]))