如何在R中搜索顺序编号的矩阵变量
我有一个关于R的问题 我有一些顺序编号的矩阵(所有维度都相同),我想搜索它们并生成一个最终矩阵,其中包含(对于每个矩阵元素)超过定义阈值的次数 作为一个例子,我可以选择一个阈值0.7,我可以有以下三个矩阵 我所期望的输出将是 如果我这样做:如何在R中搜索顺序编号的矩阵变量,r,search,matrix,threshold,sequential-number,R,Search,Matrix,Threshold,Sequential Number,我有一个关于R的问题 我有一些顺序编号的矩阵(所有维度都相同),我想搜索它们并生成一个最终矩阵,其中包含(对于每个矩阵元素)超过定义阈值的次数 作为一个例子,我可以选择一个阈值0.7,我可以有以下三个矩阵 我所期望的输出将是 如果我这样做: test <- matrix1 >= 0.7 test[test==TRUE] = 1 我的想法是做一个循环,所以我对每个矩阵进行计算,并将每个“测试”结果相加,从而得到我想要的最终矩阵。但我不确定两件事:如何在变量名“matrix”中使用计数
test <- matrix1 >= 0.7
test[test==TRUE] = 1
我的想法是做一个循环,所以我对每个矩阵进行计算,并将每个“测试”结果相加,从而得到我想要的最终矩阵。但我不确定两件事:如何在变量名“matrix”中使用计数器,第二,是否有比使用循环更有效的方法
所以我在想这样的事情:
output = matrix(0,3,3)
for i in 1:3 {
test <- matrixi >= 0.7
test[test==TRUE] = 1
output = output + test }
输出=矩阵(0,3,3)
因为我在1:3{
测试=0.7
测试[test==TRUE]=1
输出=输出+测试}
当然,这不起作用,因为matrixi不会转换为matrix1、matrix2等
我真的很感谢你的帮助 如果将矩阵存储在列表中,您会发现操作更容易:
lst <- list(matrix(c(0.38, 0.58, 0.27, 0.72, 0.37, 0.55, 0.15, 0.09, 0.22), nrow=3),
matrix(c(0.19, 0.98, 0.72, 0.78, 0.65, 0.57, 0.72, 0.46, 0.76), nrow=3),
matrix(c(0.39, 0.40, 1.00, 0.68, 0.05, 0.43, 0.31, 0.92, 0.21), nrow=3))
Reduce("+", lapply(lst, ">=", 0.7))
# [,1] [,2] [,3]
# [1,] 0 2 1
# [2,] 1 0 1
# [3,] 2 0 1
如果你把矩阵放在一个数组中,这是很容易做到的,没有一个循环。下面是一个例子:
## dummy data
set.seed(1)
m1 <- matrix(runif(9), ncol = 3)
m2 <- matrix(runif(9), ncol = 3)
m3 <- matrix(runif(9), ncol = 3)
现在使用rowSums()
函数来计算所需的值
> rowSums(ind, dims = 2)
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 1 2 1
请注意,在rowSums()
中求和的内容是(有点混乱!)维度dims+1
。在本例中,我们通过每个3*3单元的板堆栈(阵列)向下求和值,因此输出中有9个值
如果需要将对象放入数组表单,可以通过
arr2 <- do.call("cbind", mget(c("m1","m2","m3")))
dim(arr2) <- c(3,3,3) # c(nrow(m1), ncol(m1), nmat)
> all.equal(arr, arr2)
[1] TRUE
arr2将矩阵保存在单独的变量中有什么原因吗?不是更方便的列表或3D数组吗?没有。似乎其他人建议使用列表或3D阵列。这似乎更有意义,但我还没有这样做的经验。我的数据以单独的变量开始,因为这是我使用的模型的输出方式。最后一点,您现在可以执行mget(paste0(“matrix”,1:100))
而不是lappy
-ingget()
@GavinSimpson--谢谢!作为一个选项添加到中。谢谢!不过,我的实际数据要大得多。我将有几百个矩阵,而不是3x3,它们将更像100x100。看起来你的最后一个代码会很有用。@user3453009是的,使用mget
或lappy
和get
构建lst
,然后使用lappy
调用Reduce
获得结果。即使您有数百个矩阵,您也应该能够通过两行代码获得结果。@user3453009您拥有的矩阵越多,它们越大,Reduce()
方法将变得越慢(可能是因为将每个矩阵转换为逻辑指示符矩阵的中间lappy()
步骤)。如果计算时间成为一个问题,rowSums()
方法可以更好地扩展,可能是因为我们避免了中间的lappy()
步骤,并在一次调用中将整个数组转换为指示符数组。谢谢大家!!我实现了rowSums方法,效果非常好。这是难以置信的帮助和非常愉快。
# Setup test data
set.seed(144)
for (i in seq(100)) {
assign(paste0("matrix", i), matrix(rnorm(10000), nrow=100))
}
all.equal(sum.josilber(), sum.gavin())
# [1] TRUE
library(microbenchmark)
microbenchmark(sum.josilber(), sum.gavin())
# Unit: milliseconds
# expr min lq median uq max neval
# sum.josilber() 6.534432 11.11292 12.47216 17.13995 160.1497 100
# sum.gavin() 11.421577 16.54199 18.62949 23.09079 165.6413 100
## dummy data
set.seed(1)
m1 <- matrix(runif(9), ncol = 3)
m2 <- matrix(runif(9), ncol = 3)
m3 <- matrix(runif(9), ncol = 3)
arr <- array(c(m1, m2, m3), dim = c(3,3,3))
ind <- arr > 0.7
> ind
, , 1
[,1] [,2] [,3]
[1,] FALSE TRUE TRUE
[2,] FALSE FALSE FALSE
[3,] FALSE TRUE FALSE
, , 2
[,1] [,2] [,3]
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE TRUE
[3,] FALSE TRUE TRUE
, , 3
[,1] [,2] [,3]
[1,] FALSE FALSE FALSE
[2,] TRUE FALSE FALSE
[3,] TRUE FALSE FALSE
> rowSums(ind, dims = 2)
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 1 0 1
[3,] 1 2 1
arr2 <- do.call("cbind", mget(c("m1","m2","m3")))
dim(arr2) <- c(3,3,3) # c(nrow(m1), ncol(m1), nmat)
> all.equal(arr, arr2)
[1] TRUE
nmat <- 200 ## number matrices
matrices <- paste0("m", seq_len(nmat))
arr <- do.call("cbind", mget(matrices))
dim(arr) <- c(dim(m1), nmat)