如何使用for循环对数据进行排序?

时间:2012-10-19 03:26:39

标签: r sorting loops

我想知道如何使用循环(可能是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

我知道通过使用命令来实现它非常简单,但作为R的初学者,我很好奇如何通过循环来做到这一点。希望有人能提供帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

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

您需要决定要使用的排序方法。 有关详细摘要,请参阅this wikipedia artile

每个排序算法都有伪代码,可以转换为R

以下是 bubbleSort 的实现,实现了来自here的伪代码

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