首页 > 解决方案 > 更快的条件行操作

问题描述

一个可重现的例子,

mat1 <- matrix(c(1,3,1,2,3,4), nrow = 2, ncol = 3, byrow = T)
jj <- c(3:1)
> mat1
     [,1] [,2] [,3]
[1,]    1    3    1
[2,]    2    3    4

我想检查 mat1 的第一行,如果有 1 我想做点什么,否则什么也不会发生。例如,对于那个 1,我将 jj[i] 相加,然后将它们加在一起,如下所示:

sumj <- 0
for (i in 1:length(jj)){
if (mat1[1,i] == 1){
  sumj <- sumj + jj[i]
  }
}

在这种情况下,我将一一检查所有行元素并注册输出。这很好用,但我需要提高效率,因为原始矩阵有很多行,并且计算将重复多次。你能提出一些建议吗?

请不要关注总和,因为它可能是其他一些复杂的函数。

标签: rmatrixconditional-statements

解决方案


任何

colSums(t(mat1 == 1)*jj)
c((mat1 == 1) %*% jj)

jj逐行添加与等于 1 的矩阵条目对应的元素。基于矩阵乘法的方式是两者中最快的。


在 OP 的评论之后,这里有一个函数,它首先检查value矩阵的第一行中是否存在 a ,并且如果矩阵行的相应元素等于(在问题)。FUNvecjjvalue1

fun <- function(x, vec, FUN, value = 1){
  f <- match.fun(FUN)
  if(inherits(x, "array")){
    if(any(x[1, ] == value)){
      y <- f(t(x == value)*vec)
      t(y)
    } else NA
  } else NA
}

fun(mat1, jj, colSums)
#     [,1] [,2]
#[1,]    4    0
fun(mat1, jj, sin)
#        [,1] [,2]     [,3]
#[1,] 0.14112    0 0.841471
#[2,] 0.00000    0 0.000000

推荐阅读