我一直在尝试编写代码以对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()
函数用于内置函数,因此需要排序函数。请帮助我理解。
答案 0 :(得分:0)
问题是您的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
很好。