R语言 如何使用if条件只选择矩阵中与NA不同的值?

wfveoks0  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(278)

我尝试对不同于NA的数组元素应用函数。我尝试对!is.na函数使用if语句,但收到错误消息,提示"argument is of length zero"。有人知道如何修复该错误,或者有其他方法仅选择矩阵的非NA值吗?

F <- function(x, a, b, c, d) { 
  f <- a*(tanh(b*(x - c)) - d)
  return(f)
}

nlon <- 3241 ; nlat <- 1680
p1 <- 3221 ; p2 <- 1103
pr_new <- matrix(0, nlat, nlon) # for the example 
lim <- 10 

for (n in 1:nlon) {
  a <- -0.5; b <- 1; c <- 0; d <- 1 #Parameters of F
  if (n < p1) { #left side of the step
    for (m in nlat - lim:nlat) {
      if (!is.na(c(pr_new[m, n]))) { #no calculation on the NA values
        pr_new[m, n] <- F(n, a, b, c, d)
      }
    }
  } else { #right side of the step
    if (is.na(c(pr_new[p2, n]))) { #if we are on the upper step
      for (m in p2 - 1:p2 - 1 - lim) {
        if (!is.na(c(pr_new[m, n]))) { #no calculation on the NA values
          pr_new[m, n] <- F(m, a, b, c, d)
        }
      }
    } else { #if we are on the lower step
      for (m in p2:p2 - lim) {
        if (!is.na(c(pr_new[m, n]))) { #no calculation on the NA values
          pr_new[m, n] <- F(m, a, b, c, d)
        }
      }
    }
  }
}
d7v8vwbk

d7v8vwbk1#

你可以通过在控制台输入循环索引名来找出错误发生后循环索引被设置为哪个值:

Error in if (!is.na(c(pr_new[m, n]))) { : argument is of length zero
> m
[1] 0             # R uses 1 based indexing so 0 indexed value is not there
> n
[1] 1
> str( p2:p2-lim)  # demonstrating error
 num 1093

来自@zephryl的评论是正确的,但它只识别了三次发生类似错误中的一次。

for (m in nlat-lim:nlat){ ...
 for (m in p2-1:p2-1-lim){ ...
 for (m in p2:p2-lim){ ...

在这些表达式中,由于“:“的运算符优先级高于二进制减号,因此使用冒号和minnus符号的表达式被错误地构造。您可以在?Syntax帮助页中找到运算符优先级规则。
如果您更正了这三个错误,您将得到运行时没有错误的代码。

for (n in 1:nlon){
    a= -0.5; b=1; c=0; d=1 #Parameters of F
    if (n<p1){ #left side of the step
        for (m in (nlat-lim):nlat ){  # fix #1
            if (!is.na(c(pr_new[m,n]))){ #no calculation on the NA values
                pr_new[m,n]=F(n,a,b,c,d)
            }
        }
    }
    else{ #right side of the step
        if (is.na(c(pr_new[p2,n]))) { #if we are on the upper step
            for (m in (p2-1):(p2-1-lim) ){  # fix #2
                if (!is.na(c(pr_new[m,n]))){ #no calculation on the NA values
                    pr_new[m,n]=F(m,a,b,c,d)
                }
            }
        }
        else { #if we are on the lower step
            for (m in p2:(p2-lim) ){   # fix # 3
                if (!is.na(c(pr_new[m,n]))){ #no calculation on the NA values
                    pr_new[m,n]=F(m,a,b,c,d)
                }
            }
        }
    }
}

关于来自一个低代表的新用户的间接“答案”,我确实测试了它可能返回类似答案的理论。我确实在一些问题上尝试了chatGPT,并注意到它不仅返回了不正确的答案,而且在报告给它时也无法从错误中学习。当问题的标题和正文被提供给ChatGPT时,它给出了与现在删除的答案几乎相同的答案。
which函数可用于从数组或矩阵返回索引向量,但在arr.ind参数设置为非默认值的情况下使用该函数最为有用:..., arr.in = TRUE。和na.omit可用于从矩阵中删除大小写。但是,它将删除包含单个NA的任何行的整行值。

相关问题