-3

我想知道如何使用循环(可能是 for 循环)对数据进行排序,如下所示。

      [,1]
 [1,]  179
 [2,]  160
 [3,]  136
 [4,]  227
 [5,]  217
 [6,]  168
 [7,]  108
 [8,]  124
 [9,]  143
[10,]  140

我尝试使用这样的循环:

for (i in 1:nrow(v)) {
for (j in i+1:nrow(v)) {
if (v[i] > v[j]) {
v[i] <- v[j]
}
else {
v[i] <- v[i]
}
}
}
v

但最后出现了一条错误消息:/

Error in if (chickwts[i, 1] > chickwts[j, 1]) { : 
  missing value where TRUE/FALSE needed

我知道这很简单,使用 order 来做,但作为 R 的初学者,我很好奇如何通过循环来做到这一点。希望有人可以提供帮助。谢谢!

4

1 回答 1

2

简短的回答是不要,因为sort.list使用内部优化好的代码更有效地实现了数字排序算法。

您需要决定要使用的排序方法。请参阅此维基百科文章 以获得很好的摘要。

每个排序算法都有伪代码,可以翻译成 R

这是一个bubbleSort的实现,从这里实现伪代码

procedure bubbleSort( A : list of sortable items )
   repeat     
     swapped = false
     for i = 1 to length(A) - 1 inclusive do:
       /* if this pair is out of order */
       if A[i-1] > A[i] then
         /* swap them and remember something changed */
         swap( A[i-1], A[i] )
         swapped = true
       end if
     end for
   until not swapped
end procedure

R这看起来像

set.seed(1)
A <- sample(10)
A

##  [1]  3  4  5  7  2  8  9  6 10  1


n <- length(A)

repeat {
    swapped = FALSE
    for (i in 2:length(A)) {
        newA <- A
        if (A[i - 1] > A[i]) {
            newA[i - 1] <- A[i]
            newA[i] <- A[i - 1]
            A <- newA
            swapped <- TRUE
        }
    }
    if (!swapped) {break}
}
# ta da!
A

##  [1]  1  2  3  4  5  6  7  8  9 10
于 2012-10-19T04:57:31.170 回答