2012-10-19 37 views
-2

我想知道如何使用循環(可能是for循環)來排序數據如下。如何使用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的初學者,我很好奇如何通過循環做到這一點。希望有人能幫忙。謝謝!

+0

查看'sort','rank','order'。你可以從'>幫助(排序)' – liuminzhao

+0

實際上看到幫助文件,我想在if語句之後出來。 (v [i,1]> v [j,1]) {表達式} }對於(i in nrow(v)){ } { } } ' 我也嘗試搜索關鍵字,如排序,循環和秩序,也檢查了幫助文件。對於那個很抱歉... – Jenaro

回答

2

簡短的答案是不要,因爲sort.list使用內部的優化代碼更有效地實現了數字排序算法。

您需要決定您希望使用的排序方法。 請參閱this wikipedia artile以獲得一個很好的總結。

的排序算法各有僞代碼可以被翻譯至R

這裏是一個冒泡的實現,從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 
相關問題