Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中搜索顺序编号的矩阵变量_R_Search_Matrix_Threshold_Sequential Number - Fatal编程技术网

如何在R中搜索顺序编号的矩阵变量

如何在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”中使用计数

我有一个关于R的问题

我有一些顺序编号的矩阵(所有维度都相同),我想搜索它们并生成一个最终矩阵,其中包含(对于每个矩阵元素)超过定义阈值的次数

作为一个例子,我可以选择一个阈值0.7,我可以有以下三个矩阵

我所期望的输出将是

如果我这样做:

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
-ing
get()
@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)