R语言新手自定义median函数返回NA,无法定位问题
自定义R中位数函数返回NA的排查与修正
核心报错原因
函数返回NA的根源是偶数长度分支的逻辑完全错位:
你在偶数长度分支中,先是把排序后指定位置的元素值存到了med1、med2变量里,后续又直接把这两个元素值当成向量索引去取数。当向量元素值偏大时,传入的索引位置会远超过向量实际长度,R语言对超出长度的索引取值会直接返回NA。
用测试向量c(10,20,30,40)可以完整复现这个报错流程:
- 计算得到向量长度
len=4,进入偶数判断分支 len/2为2,sorted[2]的结果是20,因此med1 = 20(len+1)%/%2为2,sorted[2]的结果是20,因此med2 = 20- 计算取数索引为
med1 + med2/2 = 20 + 10 =30 - 对长度仅为4的向量取第30位的元素,直接返回NA
偶数分支还存在另外两个逻辑缺陷:
- 偶数长度向量的两个中间位置本应是
len/2和len/2 +1,你写的两个位置表达式计算结果完全一致,根本没有取到两个不同的中间值 - 计算两值平均值时,没有用括号包裹求和部分,按运算优先级会先计算
med2/2再和med1相加,和“两个值取平均”的计算逻辑完全不符 - 奇数长度分支的索引计算逻辑正确,无明显问题
修正后的可运行代码
mymedian <- function(x) { len <- length(x) sorted <- sort(x) if (len %% 2 == 0) { # 先存储两个中间位置的索引,而非索引对应的元素值 idx1 <- len / 2 idx2 <- len / 2 + 1 # 按索引取出两个中间值计算平均 med1 <- sorted[idx1] med2 <- sorted[idx2] result <- (med1 + med2) / 2 return(result) } else { idx <- (len + 1) / 2 result <- sorted[idx] return(result) } }
效果验证
修正后可和R原生median()函数交叉校验:
- 奇数长度输入:
mymedian(c(1,5,3))返回3,和原生函数结果一致 - 偶数长度输入:
mymedian(c(1,2,3,4))返回2.5,和原生函数结果一致
内容的提问来源于stack exchange,提问作者Umutcan
相关产品推荐
相关产品推荐

