获取所有可能的两个列子集

时间:2013-06-04 23:38:06

标签: r

我是R的相对新手,我现在非常接近完成一个相当长的剧本,非常感谢迄今为止在各个步骤帮助我的所有人。我有另一点我坚持下去。我已将问题简化为:

Dataset1
ax ay
1  3
2  4

Dataset2
bx by
5   7
6   8

A <- dataset1
B <- dataset2
a <- 2 #number of columns
b <- 1:2

(我的数据集的列数会有所不同,所以我需要能够改变这个因素)

我希望这个答案能够以任何顺序(即两个数据集中每个数据集的两个列的所有可能组合),如此或等效。

[[1]]
1  5
2  6

[[2]]
1  7
2  8

[[3]]
3  5
4  6

[[4]]
3  7
4  8

但我没有得到它。 我尝试了很多东西,最接近我想要的是:

i <- 1
for( i in 1:a )
 {
   e <- lapply(B, function(x) as.data.frame(cbind(A, x)))
   print(e)
   i <- i+1
  }

关闭,是的。我可以采取答案,做一些摆弄和子集,但它不对,必须有一个简单的方法来做到这一点。我的在线搜索中没有看到这样的东西。任何帮助非常感谢。

3 个答案:

答案 0 :(得分:6)

这样的事情对你有用吗?

Dataset1 <- data.frame(ax=1:2,ay=3:4)
Dataset2 <- data.frame(bx=5:6,by=7:8)

apply(
    expand.grid(seq_along(Dataset1),seq_along(Dataset2)),
    1,
    function(x) cbind(Dataset1[x[1]],Dataset2[x[2]])
     )

结果:

[[1]]
  ax bx
1  1  5
2  2  6

[[2]]
  ay bx
1  3  5
2  4  6

[[3]]
  ax by
1  1  7
2  2  8

[[4]]
  ay by
1  3  7
2  4  8

答案 1 :(得分:1)

如果我理解了这个问题,我认为您可以使用combn来选择所需的列。例如,如果希望8列的所有组合在时间上取2,那么您可以这样做:

combn(1:8, 2)

其中(部分为了可读性):

combn(1:8,2)[,c(1:5, 15:18)]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    1    1    1    1    3    3    3    3
[2,]    2    3    4    5    6    5    6    7    8

那么这个矩阵的列可以用作你想要的索引。

答案 2 :(得分:1)

我认为最简单的方法与您尝试过的方法非常相似,使用两个显式循环。但是,我仍然会做一些不同的事情:

  1. 预分配列表空间
  2. 使用明确的counter
  3. 使用drop=FALSE
  4. 然后你可以做到以下几点。

    A <- read.table(text = "ax ay
    1  3
    2  4", header = TRUE)
    
    B <- read.table(text = "bx by
    5   7
    6   8", header = TRUE)
    
    out <- vector("list", length = ncol(A) * ncol(B))
    counter <- 1
    for (i in 1:ncol(A)) {
        for (j in 1:ncol(B)) {
            out[[counter]] <- cbind(A[,i, drop = FALSE], B[,j, drop = FALSE])
            counter <- counter + 1
        }
    }
    out
    
    ## [[1]]
    ##   ax bx
    ## 1  1  5
    ## 2  2  6
    ## 
    ## [[2]]
    ##   ax by
    ## 1  1  7
    ## 2  2  8
    ## 
    ## [[3]]
    ##   ay bx
    ## 1  3  5
    ## 2  4  6
    ## 
    ## [[4]]
    ##   ay by
    ## 1  3  7
    ## 2  4  8