从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