我是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
}
关闭,是的。我可以采取答案,做一些摆弄和子集,但它不对,必须有一个简单的方法来做到这一点。我的在线搜索中没有看到这样的东西。任何帮助非常感谢。
答案 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)
我认为最简单的方法与您尝试过的方法非常相似,使用两个显式循环。但是,我仍然会做一些不同的事情:
counter
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