【问题标题】:How to sort data by using for loop? [closed]如何使用for循环对数据进行排序? [关闭]
【发布时间】:2012-10-19 03:26:38
【问题描述】:

我想知道如何使用循环(可能是 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 的初学者,我很好奇如何通过循环来做到这一点。希望有人可以提供帮助。谢谢!

【问题讨论】:

  • 查看sortrankorder。您可以从&gt; help(sort)查看帮助文件
  • 实际上,我正试图在 if 语句之后表达出来。 for (i in nrow(v)) { for (j in i+1:nrow(v)) { if (v[i, 1] &gt; v[j, 1]) {expression} } } 我也尝试过搜索关键字,如排序、循环和排序,还检查了帮助文件。抱歉……

标签: r sorting loops


【解决方案1】:

简短的回答是不要,因为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

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 2018-08-23
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多