R语言 值为0或1的矩阵

yquaqz18  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(300)

我有下一个矩阵:

structure(list(`1` = c(0, 0, NA, NA, NA, NA, 0, 0, NA, NA, NA, 
1, NA, NA, NA), `2` = c(1, 0, NA, NA, NA, NA, NA, 0, NA, NA, 
NA, 1, NA, NA, NA), `4` = c(NA, NA, 0, 1, 1, 0, NA, NA, 0, 1, 
1, NA, 1, 0, 0), `5` = c(NA, NA, 0, 1, 1, 0, NA, NA, 1, 1, NA, 
NA, 1, 0, 1), `6` = c(NA, NA, 0, 1, 1, 0, NA, NA, 1, 0, NA, NA, 
1, 0, NA), `7` = c(NA, NA, NA, 1, 1, 0, NA, NA, 0, 1, NA, NA, 
1, 0, NA), `8` = c(NA, NA, NA, 1, 0, 0, NA, NA, 1, 0, NA, NA, 
1, 0, NA)), row.names = c(NA, 15L), class = "data.frame")

我想创建以下矩阵的基础上,在以前的矩阵,我已经创建了下一个代码,但它不工作。

for(i in 1:nrow(mat)){
  for(j in 1:7){
    if(mat[i,j]==0){
      next }else{
    if(mat[i,j]==1){
        mat[i,j:7]<-1
      }else{
        if(is.na(mat[i,j])){
    mat[i,j]<-NA
      }}}
  }
  
}

例如,对于每一行:
0,0,0,1,0,0,0

  • 如果在该行中存在1,则在该1之后的所有元素应当等于1。
  • 如果存在NA,则此值应等于NA

这个想法是建立一个矩阵来描述一段时间内的干预。我的意思是1是干预被应用的时间。

  • 如果我有这样的东西:0,NA,NA,1,0,NA,1我想得到例如:0、不可用、不可用、1、1、不可用、1

我希望你能帮我。

b4lqfgs4

b4lqfgs41#

使用cummax + apply

t(apply(mat, 1, \(x) cummax(ifelse(is.na(x), 0, x)) + x*0))

输出功率

cfh9epnr

cfh9epnr2#

使用cummax的向量化函数:

f <- function(m) {
  blnNA <- is.na(m)
  m[blnNA] <- 0
  m <- matrix(cummax(c(t(m + 1:nrow(m)))), nrow(m), ncol(m), 1) - 1:nrow(m)
  m[blnNA] <- NA
  m
}

f(m)
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#>  [1,]    0    1   NA   NA   NA   NA   NA
#>  [2,]    0    0   NA   NA   NA   NA   NA
#>  [3,]   NA   NA    0    0    0   NA   NA
#>  [4,]   NA   NA    1    1    1    1    1
#>  [5,]   NA   NA    1    1    1    1    1
#>  [6,]   NA   NA    0    0    0    0    0
#>  [7,]    0   NA   NA   NA   NA   NA   NA
#>  [8,]    0    0   NA   NA   NA   NA   NA
#>  [9,]   NA   NA    0    1    1    1    1
#> [10,]   NA   NA    1    1    1    1    1
#> [11,]   NA   NA    1   NA   NA   NA   NA
#> [12,]    1    1   NA   NA   NA   NA   NA
#> [13,]   NA   NA    1    1    1    1    1
#> [14,]   NA   NA    0    0    0    0    0
#> [15,]   NA   NA    0    1   NA   NA   NA

相关问题