我有一个名为“ft”的矩阵,这是一些逻辑测试的结果。 这是一个示例,矩阵为 [10,5]。 在实际工作中,它将有数千行、更多列和大约数百个矩阵。
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 1 1 1 1 1
[3,] 0 1 1 1 1
[4,] 1 1 1 1 1
[5,] 1 1 1 1 1
[6,] 1 1 1 1 1
[7,] 1 1 1 1 1
[8,] 1 1 1 1 1
[9,] 1 1 1 1 1
[10,] 1 0 1 1 1
我需要对上一列中的值进行逻辑测试。如果前一列的值为零,则该列的其余部分也将为零。
例如,向量 [3,1]
的值为零,因此行 [3,]
中列的其余部分将为零。同样,[10,2]
中的元素为零,因此行 [10,3:5]
将为零
所以新矩阵的结果将是这样的:
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 1 1 1 1 1
[3,] 0 0 0 0 0
[4,] 1 1 1 1 1
[5,] 1 1 1 1 1
[6,] 1 1 1 1 1
[7,] 1 1 1 1 1
[8,] 1 1 1 1 1
[9,] 1 1 1 1 1
[10,] 1 0 0 0 0
我对 R 完全陌生,我尝试了如下几种替代方案:
ctes=cbind(ftes[,1], (ftes[,2:t]==1 & ctes[,-1]==1))
但这完全是错误的。 如何使用矢量化方法而不是循环测试有效地做到这一点。
最佳答案
我不认为基础 R 提供了矢量化方法来解决这个问题,但如果效率很重要,您可以尝试使用 matrixStats
包
matrixStats::rowCummins(ft)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 1 1 1 1
# [2,] 1 1 1 1 1
# [3,] 0 0 0 0 0
# [4,] 1 1 1 1 1
# [5,] 1 1 1 1 1
# [6,] 1 1 1 1 1
# [7,] 1 1 1 1 1
# [8,] 1 1 1 1 1
# [9,] 1 1 1 1 1
# [10,] 1 0 0 0 0
200MB 大小矩阵的基准
set.seed(123)
Bigft <- matrix(sample(0:1, 5e7, replace = TRUE), ncol = 100)
system.time(matrixStats::rowCummins(Bigft))
# user system elapsed
# 0.08 0.01 0.10
关于R编程: Logical test of Previous/preceding/successive Column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36128279/