【问题标题】:Sorting a vector in R without using sort function在不使用排序函数的情况下对 R 中的向量进行排序
【发布时间】:2019-02-08 08:02:58
【问题描述】:

我正在尝试编写一个函数来对向量进行排序,但没有使用 R 的内置“排序”函数。 我的代码:

sorting <- function(x){
  for(i in 1:length(x)){
    for(j in (i+1):length(x)){
      if(x[i] > x[j]){
        x[c(i,j)] = x[c(j,i)]
      }
    }
  }
  x
}

我得到以下输出:

> x <- c(3,1,4,7,2,9)
> sorting(x)
Error in if (x[i] > x[j]) { : missing value where TRUE/FALSE needed
> 

我知道当 'IF' 条件返回 'NA' 而不是 TRUE/FALSE 时,我们会遇到上述错误。

语句是否有问题:

for(j in (i+1):length(x)){

相同的 Python 代码:

def sorting(a):
    for i in range(len(a)):    
        for j in range(i+1,len(a)):
            if a[i] > a[j]:
                a[i],a[j] = a[j],a[i]

    return a

输出:

sorting([3,1,4,7,2,9])
Out[380]: [1, 2, 3, 4, 7, 9]

在 Python 中,代码运行良好。

谁能让我知道我的 R 代码的问题。

【问题讨论】:

  • R 中的冒泡排序

标签: r for-loop if-statement


【解决方案1】:

问题在于(i+1)。当length(x) 达到最大值时,j 超出范围。我添加了这个:(length(x)-1)

sorting <- function(x){
  for(i in 1:(length(x)-1)){
    for(j in (i+1):length(x)){
      if(x[i] > x[j]){
        x[c(i,j)] = x[c(j,i)] # +1 for this
      }
    }
  }
  x
}

sorting(c(3,1,4,7,2,9))
[1] 1 2 3 4 7 9

【讨论】:

    【解决方案2】:
    Sorting <- function(x){
        xs <- rep(0, length(x))
        for(i in 1:length(x)){
              xs[i] = min(x)
              x <- x[x != min(x)]
              }
        xs
    }
    
    Sorting(c(3,1,4,7,2,9))
    [1] 1 2 3 4 7 9
    

    排序是一个带有数字向量参数x 的函数。最初xs,与x 长度相同的排序向量,用零填充。 for循环旨在将向量x的最小值分配给xs(for(i in 1:length(x)){ xs[i] = min(x) )的每个分量。然后,我们通过x &lt;- x[x != min(x)] } 从 x 中删除这样的最小值,以找到下一个最小值。最后,xs 显示了x 的排序向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2020-11-12
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多