在R中使用apply查找并输出含缺失值的矩阵对应行名及缺失位置
问题原因
- 你写的for循环迭代条件错误:
length(missing) != 0L是布尔值,仅能返回TRUE/FALSE,无法遍历列表中每个行的计算结果 - 没有缺失值的行在
missing列表中对应长度为0的空向量,你没有对这部分内容做过滤
正确实现方案
方案1:简洁向量化实现(无需循环)
直接过滤掉无缺失值的空元素即可得到你要的结果:
# 过滤所有长度大于0的元素,即存在缺失值的行 missing_result <- Filter(function(x) length(x) > 0, missing) # 打印结果,键为行名/行号,值为对应行的缺失列位置 print(missing_result)
方案2:循环实现(符合你原本的实现思路)
遍历列表所有元素,判断存在缺失值时再打印:
# seq_along生成和missing列表长度一致的索引序列 for(i in seq_along(missing)) { # 判断当前行是否存在缺失值 if(length(missing[[i]]) > 0) { cat("行标识:", names(missing)[i], " 缺失列位置:", missing[[i]], "\n") } }
更高效率的替代方案
如果你的矩阵规模较大,完全可以不用apply遍历,直接用which的arr.ind参数直接提取所有缺失值的行列索引,再按行分组即可:
# 直接获取所有缺失值的行、列索引矩阵 na_all <- which(is.na(matrix), arr.ind = TRUE) # 按行分组,得到每行对应的缺失列位置 missing_result <- split(na_all[, "col"], na_all[, "row"]) print(missing_result)
内容的提问来源于stack exchange,提问作者Luker354
相关产品推荐
相关产品推荐

