R中数据框各列升序排列NA置后排序错误解决及代码优化
错误原因
- 核心问题是你生成的
MAT矩阵是字符类型,排序时按照字符串字典序而非数值大小排序:- 你调用
apply对每列返回"YES"/"NO"字符串,此时整个矩阵被强制转换为字符型 - 后续给矩阵赋值行号
i时,数值型的i会被自动转成字符串存储 - 字符串排序规则是逐位比较,
"10"的首字符是'1',比"4"的首字符'4'小,所以"10"会排在"4"前面,导致排序结果不符合数值升序的预期。
- 你调用
修正方案
直接修改原有代码
调整逻辑避免生成字符矩阵,直接生成数值型矩阵处理即可:
a<-c(5,1,0,3,2,0.6,1.6,7,9,0) b<-c(11,0,1,18,11,11,0,13,20,10) c<-c(10,20,0.7,0.8,0.3,0.4,0,0.9,1,1) MAT <- cbind(a,b,c) # 逐元素判断:大于5的存对应行号,否则存NA,直接生成数值矩阵 MAT <- apply(MAT, 2, function(x) ifelse(x >5, seq_along(x), NA)) # 对每列做升序排序,NA放最后 MAT <- apply(MAT, 2, sort, na.last = TRUE) print(MAT)
运行后输出符合预期:
a b c [1,] 8 1 1 [2,] 9 4 2 [3,] NA 5 NA [4,] NA 6 NA [5,] NA 8 NA [6,] NA 9 NA [7,] NA 10 NA [8,] NA NA NA [9,] NA NA NA [10,] NA NA NA
更简洁的实现
可以把判断、排序的逻辑合并到一次apply调用中,减少冗余步骤:
a<-c(5,1,0,3,2,0.6,1.6,7,9,0) b<-c(11,0,1,18,11,11,0,13,20,10) c<-c(10,20,0.7,0.8,0.3,0.4,0,0.9,1,1) MAT <- apply(cbind(a,b,c), 2, function(x) sort(ifelse(x>5, seq_along(x), NA), na.last = TRUE))
内容的提问来源于stack exchange,提问作者MK Huda
相关产品推荐
相关产品推荐

