获取所有可能的两列子集

问题描述:

我是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 
    } 

关闭,是的。我可以接受答案并做一些摆弄和子集工作,但它不正确,必须有一个简单的方法来做到这一点。在我的在线搜索中,我没有看到任何此类内容。任何帮助非常感谢。

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

  1. 预分配列表空间
  2. 使用一个明确的counter
  3. 使用drop=FALSE

然后,你可以做到以下几点。

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 
+0

完美!正是我需要的。我特别喜欢explcit计数器。我觉得我走上了正确的道路,但并不是那样,我现在看到了。非常感激! –

是否有这样的工作适合你?

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 
+0

这工作,其实很好,但我需要亨利克提供的柜台。我希望我能打勾这两个正确的答案。感谢您花时间回答。我很欣赏它。 –

+0

@NatalieBjorklund - 几乎可以肯定会有一种解决方法来生成各种计数器。在这种情况下,计数器将以“长度(结果)”结束。从长远来看,R中的for(in ...)逻辑经常会变得更加复杂,但我明白这只是更大脚本的一部分。 – thelatemail

+0

这个计数器在较长的脚本中是有意义的,但是被说了,我会检查是否可以用你的答案摆脱柜台,因为我喜欢不那么复杂。所以谢谢。 –

如果我理解这个问题,我想你可以使用combn选择您想要的列。举例来说,如果想在时刻采取2 8列的所有组合,你可以这样做:

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 

所以后来这个矩阵的列可以被用作你想要的索引。

+0

我不认为这会起作用,因为我必须能够反复使用不同的数据集,这些数据集可能有或没有相同的列数,除了每个数据集中的列数之外,我不会知道任何内容因为它是生成的。但我很感激你花时间回答。谢谢。 –

+0

@NatalieBjorklund对于将来的使用,如您在每个数据集中阅读的内容,如果有帮助,您可以使用ncol来查找列数。 –

+0

是的,我注意到并记录下来。这将在未来有用。 –