我有一个矩阵列表(大约数十万)。我想创建一个矩阵,其中的单元格对应于例如95%。我的意思是:如果单元格 mat[1,2]
在 95% 的矩阵中为正(即 >0),则得分为 1,例如单元格 mat[2,1]
在 95% 的矩阵中为负(即 <0),其得分为 -1。如果低于此阈值,则得分为 0。
#Dummy data
listX <- list()
for(i in 1:10){listX[[i]]<-matrix(rnorm(n = 25, mean = 0.5, sd = 1),5,5)}
listX2 <- listX
for(i in 1:10) { listX2[[i]] <- ifelse(listX[[i]] >0, 1, -1) }
出于虚拟数据的考虑,可以将 95% 更改为 60%,这样在 10 个矩阵中的 6 个中保留其符号的单元格将被保留,并评分为 1 或 -1,其余评分为 0。
我陷入困境,因此无法提供更多代码。
最佳答案
我会这样做:
listX <- list()
set.seed(20)
# I set seed for reproducability, and changed your mean so you could see the negatives
for(i in 1:10){listX[[i]]<-matrix(rnorm(n = 25, mean = 0, sd = 1),5,5)}
threshold <- 0.7
(Reduce('+',lapply(listX,function(x){x > 0}))/length(listX) >= threshold) - (Reduce('+',lapply(listX,function(x){x < 0}))/length(listX) >= threshold)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 -1 1
[2,] -1 1 -1 -1 1
[3,] 0 0 0 1 1
[4,] 0 1 0 0 0
[5,] 0 0 0 0 0
这基本上检查两个条件,并将两个检查加在一起。分解条件之一(Reduce('+',lapply(listX,function(x){x > 0}))/length(listX) > threshold)
lapply(listX,function(x){x > 0})
循环遍历每个矩阵,并将其转换为每个大于零的值的真/假矩阵。
Reduce('+',lapply(listX,function(x){x > 0}))/length(listX)
然后将它们全部加在一起( Reduce
),并除以观察次数。如果该比例大于我们的阈值,我们将该值设置为 1,如果不是,则将该值设置为零。
然后我们用 x < 0
减去相同的矩阵作为测试,给出 -1
在每种情况下都有足够的子值为负数。
关于r - 从矩阵列表创建 X % 概率矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42428184/