从data.frame中选择大型子集

从data.frame中选择大型子集,r,R,我有一个巨大的数据集: library(gtools) a<-permutations(2,20,v=c(0,1),repeats.allowed=TRUE) a<-as.data.frame(a) 因此,我需要一个矩阵或data.frame,其中“a”的每一行都包含从“a”中选择的列 问题是这个过程非常缓慢。我想知道是否有更快的方法来做到这一点 上面的例子显示了这个过程有多慢。 以下是一个较小的示例: library(gtools) a<-permutations(2,

我有一个巨大的数据集:

library(gtools)
a<-permutations(2,20,v=c(0,1),repeats.allowed=TRUE)
a<-as.data.frame(a)
因此,我需要一个矩阵或data.frame,其中“a”的每一行都包含从“a”中选择的列

问题是这个过程非常缓慢。我想知道是否有更快的方法来做到这一点

上面的例子显示了这个过程有多慢。 以下是一个较小的示例:

 library(gtools)
 a<-permutations(2,5,v=c(0,1),repeats.allowed=TRUE)
 a<-as.data.frame(a)



 set.seed(123)
  b<-replicate(5,sample(1:5,5, replace=T))
  b<-t(b)
这是通过以下方式实现的:

sapply(1:N, function(y) a[i,c(as.vector(b[,y]))]) 
对“a”中的每一行重复1-4次 这是通过添加for循环来完成的:

for (i in 1:nrow(a)) sapply(1:ncol(b), function(y) a[i,c(as.vector(b[,y]))]) 
使用

或者让它保持在阵列中

 arr1 <- array(t(a2), dim=c(5,5,22))

res1[[22]]
#      [,1] [,2] [,3] [,4] [,5]
#[1,]    0    1    0    1    0
#[2,]    0    0    1    0    0
#[3,]    1    0    0    0    0
#[4,]    1    0    0    0    1
#[5,]    1    0    0    1    0

arr1[,,22]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    1    0    1    0
# [2,]    0    0    1    0    0
# [3,]    1    0    0    0    0
# [4,]    1    0    0    0    1
# [5,]    1    0    0    1    0

在您的代码中,N是什么?。在示例数据集b中,还有重复值。我在小一点的衣服上试过,谢谢你的帮助。您的建议是如何根据b从a1中选择列。这确实是我想要做的,但是:将“b”中的每一列视为一个向量,指定从“a”中选择哪些列这就是为什么我有sapply,然后对'a'中的每一行这样做。这就是为什么我有loopp.s.的理由。我编辑了我的问题并指定了N是什么。对不起,cb不会给你一个向量吗。我没有遵循逻辑。或者你想这样做。索引a的第一行和b的第一列,然后索引a的第二列和b的第一列。以此类推,然后再次使用a的第二列开始相同的过程。尝试:a2
sapply(1:N, function(y) a[i,c(as.vector(b[,y]))]) 
for (i in 1:nrow(a)) sapply(1:ncol(b), function(y) a[i,c(as.vector(b[,y]))]) 
 a1 <- a[1:22,]
 a2 <- as.matrix(a1[,c(b)])

 res1 <- lapply(split(a2, row(a2)), function(x) { matrix(x,ncol=ncol(b))})
 arr1 <- array(t(a2), dim=c(5,5,22))

res1[[22]]
#      [,1] [,2] [,3] [,4] [,5]
#[1,]    0    1    0    1    0
#[2,]    0    0    1    0    0
#[3,]    1    0    0    0    0
#[4,]    1    0    0    0    1
#[5,]    1    0    0    1    0

arr1[,,22]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    1    0    1    0
# [2,]    0    0    1    0    0
# [3,]    1    0    0    0    0
# [4,]    1    0    0    0    1
# [5,]    1    0    0    1    0