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