-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 に答える