获取所有可能的两列子集
我是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
}
关闭,是的。我可以接受答案并做一些摆弄和子集工作,但它不正确,必须有一个简单的方法来做到这一点。在我的在线搜索中,我没有看到任何此类内容。任何帮助非常感谢。
我认为最简单的方法与您尝试的方法非常相似,使用两个显式循环。然而,仍然有一些事情我会做出不同:
- 预分配列表空间
- 使用一个明确的
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
是否有这样的工作适合你?
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
这工作,其实很好,但我需要亨利克提供的柜台。我希望我能打勾这两个正确的答案。感谢您花时间回答。我很欣赏它。 –
@NatalieBjorklund - 几乎可以肯定会有一种解决方法来生成各种计数器。在这种情况下,计数器将以“长度(结果)”结束。从长远来看,R中的for(in ...)逻辑经常会变得更加复杂,但我明白这只是更大脚本的一部分。 – thelatemail
这个计数器在较长的脚本中是有意义的,但是被说了,我会检查是否可以用你的答案摆脱柜台,因为我喜欢不那么复杂。所以谢谢。 –
如果我理解这个问题,我想你可以使用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
所以后来这个矩阵的列可以被用作你想要的索引。
我不认为这会起作用,因为我必须能够反复使用不同的数据集,这些数据集可能有或没有相同的列数,除了每个数据集中的列数之外,我不会知道任何内容因为它是生成的。但我很感激你花时间回答。谢谢。 –
@NatalieBjorklund对于将来的使用,如您在每个数据集中阅读的内容,如果有帮助,您可以使用ncol来查找列数。 –
是的,我注意到并记录下来。这将在未来有用。 –
完美!正是我需要的。我特别喜欢explcit计数器。我觉得我走上了正确的道路,但并不是那样,我现在看到了。非常感激! –