r - 更快的条件行操作
问题描述
一个可重现的例子,
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]
}
}
在这种情况下,我将一一检查所有行元素并注册输出。这很好用,但我需要提高效率,因为原始矩阵有很多行,并且计算将重复多次。你能提出一些建议吗?
请不要关注总和,因为它可能是其他一些复杂的函数。
解决方案
任何
colSums(t(mat1 == 1)*jj)
c((mat1 == 1) %*% jj)
将jj
逐行添加与等于 1 的矩阵条目对应的元素。基于矩阵乘法的方式是两者中最快的。
在 OP 的评论之后,这里有一个函数,它首先检查value
矩阵的第一行中是否存在 a ,并且如果矩阵行的相应元素等于(在问题)。FUN
vec
jj
value
1
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
推荐阅读
- c# - 如何确保 Thread.Sleep() 是同步的?
- networking - 创建 Kubernetes Pod 网络映射
- python-3.x - 命令在 vscode powershell 终端中不起作用
- python - 打印一个 numpy 数组列表
- html - 反应组件高度
- javascript - 播放 webm 块流时音频不同步
- dataframe - 使用 groupBy() 的 pySpark 子数据帧
- python - 如何用另一个字典数组中的元素替换一个字典中的值数组
- amazon-web-services - 使用 SSE 加密的 boto3 generate_presigned_url
- c# - 如何处理来自触发事件的重叠 Console.Writeline()?