【问题标题】:Writing a median function in R在 R 中编写中值函数
【发布时间】:2019-12-18 15:51:52
【问题描述】:

我的任务是在 R 中编写自己的中值函数,而不使用内置的中值函数。如果数字是奇数;计算两个中间值,就像通常的中值一样。 我可能可以在 Java 中做一些事情,但我对

中的一些语法感到困惑

R 代码:

list1 <- c(7, 24, 9, 42, 12, 88, 91, 131, 47, 71)

sorted=list1[order(list1)]
sorted
n = length(sorted)
n
if(n%2==0) # problem here, implementing mod() and the rest of logic.

【问题讨论】:

  • 你能显示预期的输出吗?我在您的代码中显示了问题
  • list1 的预期输出应该是 '88' - 而 list2 = 1, 2, 3, 4,应该使用 2.5。
  • '88' 不是list1 的中位数。你想要一个真正的中位数,还是一个经过调整的“中位数”?
  • 描述不对
  • @ErrorJordan 那是我的错(看起来不正确)。中位数应该是 (88+12)/2 = 50。当然,没有对列表进行排序。

标签: r median


【解决方案1】:

这是一个自写的函数mymedian

mymedian <- function(lst) {
  n <- length(lst)
  s <- sort(lst)
  ifelse(n%%2==1,s[(n+1)/2],mean(s[n/2+0:1]))
}

示例

list1 <- c(7, 24, 9, 42, 12, 88, 91, 131, 47, 71)
list2 <- c(7, 24, 9, 42, 12, 88, 91, 131, 47)
mymedian(list1)
mymedian(list2)

这样

> mymedian(list1)
[1] 44.5

> mymedian(list2)
[1] 42

【讨论】:

  • 工作得很好,这很难实现:n
【解决方案2】:

我相信这应该会为您提供所需的中位数:

homemade_median <- function(vec){
  sorted <- sort(vec)
  n <- length(sorted)
  if(n %% 2 == 0){
    mid <- sorted[c(floor(n/2),floor(n/2)+1)]
    med <- sum(mid)/2
  } else {
    med <- sorted[ceiling(n/2)]
  }
  med
}

homemade_median(list1)
median(list1) # for comparison

【讨论】:

    【解决方案3】:

    一个可以解决问题的简短函数:

    my_median <- function(x){
       # Order Vector ascending
       x <- sort(x)
       # For even lenght average the value of the surrounding numbers
       if((length(x) %% 2) == 0){
        return((x[length(x)/2] + x[length(x)/2 + 1]) / 2)
       }
       # For uneven lenght just take the value thats right in the center
       else{
         return(x[(length(x)/2) + 0.5])
       }
    }
    

    检查它是否返回期望的结果:

    my_median(list1) 
    44.5
    median(list1)
    44.5
    #
    list2 <- c(1,4,5,90,18)
    my_median(list2)
    5
    median(list2)
    5
    
    

    【讨论】:

      【解决方案4】:

      您不需要测试均匀度,您可以使用 floorceiling 作为适当的长度的一半加一来创建一个序列:

      x <- rnorm(100)
      y <- rnorm(101)
      
      my_median <- function(x)
      {
      mid <- seq(floor((length(x)+1)/2),ceiling((length(x)+1)/2))
      mean(sort(x)[mid])
      }
      
      my_median(x)
      [1] 0.1682606
      median(x)
      [1] 0.1682606
      my_median(y)
      [1] 0.2473015
      median(y)
      [1] 0.2473015
      

      【讨论】:

        猜你喜欢
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 2021-03-06
        相关资源
        最近更新 更多