Ошибка в if (a [i] [j]> 4) {: пропущенное значение, где требуется TRUE / FALSE

#r #matrix #rows

#r #матрица #строки

Вопрос:

Найдите количество записей в каждой строке, которые больше 4.

 set.seed(75)
aMat <- matrix( sample(10, size=60, replace=T), nr=6)

rowmax=function(a)
{
  x=nrow(a)
  y=ncol(a)
  i=1
  j=1
  z=0
  while (i<=x) {
    for(j in 1:y) {
      if(!is.na(a[i][j])){
       if(a[i][j]>4){
        z=z 1
        }
        }
      j=j 1
      }
    print(z)
    i=i 1
    }
  }

rowmax(aMat)
  

Он показывает ошибку. Я не хочу применять встроенную функцию

Ответ №1:

Вы могли бы сделать это проще, подсчитав x , что больше, чем 4 использовать length .

 rowmax2 <- function(x) apply(x, 1, function(x) {x <- na.omit(x);length(x[x > 4])})
rowmax2(aMat)
# [1] 8 7 8 7 4 3
  

Ответ №2:

Если вы хотите сделать это абсолютно без каких-либо ярлыков, вы можете использовать два for цикла. по 1 для каждой строки и по одному для каждого значения в строке.

 rowmax = function(a) {
  y=nrow(a)
  result <- numeric(y)
  for(j in seq_len(y)) {
    count = 0
    for(val in a[j, ]) {
      if(!is.na(val) amp;amp; val > 4)
        count = count   1
    }
      result[j] <- count
  }
  return(result)
}

rowmax(aMat)
#[1] 8 7 8 7 4 3
  

Если вы хотите сделать это с помощью встроенных функций в базе R, вы могли бы использовать rowSums .

 rowSums(aMat > 4, na.rm = TRUE)
#[1] 8 7 8 7 4 3
  

Ответ №3:

В вашем коде есть несколько ошибок:

  1. Вы должны поместить z <- 0 внутренний while цикл
  2. Вы должны использовать a[i,j] для индексации матрицы, а не a[i][j]

Ниже приведена версия после устранения проблем

 rowmax <- function(a) {
  x <- nrow(a)
  y <- ncol(a)
  i <- 1
  j <- 1
  while (i <= x) {
    z <- 0
    for (j in 1:y) {
      if (!is.na(a[i, j])) {
        if (a[i, j] > 4) {
          z <- z   1
        }
      }
      j <- j   1
    }
    print(z)
    i <- i   1
  }
}
  

и тогда мы получаем

 > rowmax(aMat)
[1] 8
[1] 7
[1] 8
[1] 7
[1] 4
[1] 3
  

Краткий подход к его созданию заключается в использовании rowSums , например,

 rowSums(aMat, na.rm = TRUE)