R中的条件重新编码

Conditional recoding in R

这里是 R data.frame 的摘录,其中包含指标。可以看出,对于某些行,指示符切换到 1 直到行末,而其他指示符切换回零。

       [,18] [,19] [,20] [,21] [,22] [,23] [,24] 
   [1,]     0     0     0     0     0     0     0 
   [2,]     0     0     0     0     1     1     1  
   [6,]     0     0     0     0     0     0     0  
   [7,]     0     0     1     0     0     1     1  
   [8,]     0     0     0     0     0     0     0  
   [9,]     0     1     0     1     1     1     1  
  [10,]     1     1     1     1     1     1     1  
  [11,]     1     0     1     1     0     1     1

我想在 1 的序列不再变回零到行尾时识别每一行中的点。这应该由在该点之后设置为 1 的所有元素指示,而之前的元素是 0。结果将是:

       [,18] [,19] [,20] [,21] [,22] [,23] [,24] 
   [1,]     0     0     0     0     0     0     0 
   [2,]     0     0     0     0     1     1     1  
   [6,]     0     0     0     0     0     0     0  
   [7,]     0     0     0     0     0     1     1  
   [8,]     0     0     0     0     0     0     0  
   [9,]     0     0     0     1     1     1     1  
  [10,]     1     1     1     1     1     1     1  
  [11,]     0     0     0     0     0     1     1

您可以从每一行的末尾获取累计最小值:

t(apply(m, 1, function(r) rev(cummin(rev(r)))))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]    0    0    0    0    0    0    0
#[2,]    0    0    0    0    1    1    1
#[3,]    0    0    0    0    0    0    0
#[4,]    0    0    0    0    0    1    1
#[5,]    0    0    0    0    0    0    0
#[6,]    0    0    0    1    1    1    1
#[7,]    1    1    1    1    1    1    1
#[8,]    0    0    0    0    0    1    1

数据:m为1和0组成的整数矩阵

dput(m)
structure(c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
1L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 
1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L), .Dim = c(8L, 7L))