微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

错误...缺少需要TRUE / FALSE的值

如何解决错误...缺少需要TRUE / FALSE的值

我一直在尝试编写代码以对R中的向量进行排序,但我不断收到以下错误消息:Error in if (data[j] < data[k]) { : missing value where TRUE/FALSE needed

到目前为止,这是我的排序功能

sortscore <- function(data){
   new <- 0
   x <- data
  
   for (i in 1:length(data)){
      new[i] <- minscore(x)
      x <- x[x!=minscore(x)]
      x
   }
   new
}

这是minscore函数

minscore <- function(data){
  j <- 1;k <- j+1; min <- 0
  repeat {
    if(data[j]<data[k]){
      min <- data[j]
      k <- k+1
    }
    else{
      min <- data[k]
      j <- k
      k <- k+1
    }
    if(k==length(data)+1) break
  }
  return(min)
}

我只能将length()函数用于内置函数,因此需要排序函数。请帮助我理解。

解决方法

问题是您的sortscore函数在每次迭代时都将x缩小1,这意味着在最后一次迭代中,它仅包含一个数字。因此,您要在单个数字上调用minscore函数。

if(data[j]<data[k])中的测试minscore至少需要两个数字才能工作,否则将引发错误,因为k始终比j高1。如果data[2]的长度为1,则data不存在。

简单的解决方案是,如果data的长度为1,则minscore函数将其返回不变。

因此,如果我们将您的功能更改为:

minscore <- function(data){
  
  if(length(data) == 1) return(data)
  
  j <- 1;k <- j+1; min <- 0
  repeat {
    if(data[j]<data[k]){
      min <- data[j]
      k <- k+1
    }
    else{
      min <- data[k]
      j <- k
      k <- k+1
    }
    if(k==length(data)+1) break
  }
  return(min)
}

然后我们应该获得一个有效的排序功能:

x <- sample(20)
x
#> [1]  8 14 11 19 20  2  3 10  1 15  4 17  6 16  7  5 13 12 18  9

sortscore(x)
#> [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。