【问题标题】:Error in if (a[i][j] > 4) { : missing value where TRUE/FALSE neededif (a[i][j] > 4) { 中的错误:需要 TRUE/FALSE 的缺失值
【发布时间】:2021-01-06 14:58:49
【问题描述】:

查找每行中大于 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)

它显示错误。我不想在内置函数中应用

【问题讨论】:

    标签: r matrix rows


    【解决方案1】:

    您可以使用length 更轻松地计算大于4x

    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) && 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 &lt;- 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-17
          相关资源
          最近更新 更多