4

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

关闭,是的。我可以接受答案并进行一些摆弄和子集,但这是不对的,必须有一种简单的方法来做到这一点。我在网上搜索中没有看到类似的东西。非常感谢任何帮助。

4

3 回答 3

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
于 2013-06-05T00:05:42.520 回答
1

如果我理解这个问题,我认为您可以使用它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

因此,该矩阵的列可以用作您想要的索引。

于 2013-06-05T00:05:47.790 回答
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
于 2013-06-05T00:07:07.913 回答