R语言计算含NA的列表元素逐位最小值 如何简化现有代码
代码简化方案
你可以用基础R内置函数实现一行代码完成需求,无需自定义函数和两次apply类操作,和原有代码输出结果完全一致:
# 模拟数据保持和你的逻辑一致 rawval <- replicate(10, sample(c(1:10, NA), size = 10, replace = T), simplify = F) # 最简实现 tomin <- do.call(pmin, c(rawval, na.rm = TRUE))
上述代码利用R内置的pmin(并行最小值函数)直接计算多个向量对应位置的最小值,自带的na.rm = TRUE参数会自动跳过NA值参与计算,如果某一位置全为NA,pmin会自动返回NA,完全匹配你的业务规则。
两个具体问题解答
- 有没有方法可以避免最小值计算函数中的条件判断?
完全可以,上述实现直接使用原生pmin函数,无需自定义带条件判断的最小值函数。pmin本身的默认逻辑就覆盖了你的需求,不需要额外写分支判断语句。 - 是否存在apply家族的函数可以替代第一步的cbind操作?
你原有逻辑里的sapply(rawval, cbind)本身就可以简化为sapply(rawval, identity)(简写为sapply(rawval, I)),不需要额外套cbind就能得到结构完全相同的矩阵。如果要使用apply家族完成全流程计算,也可以写成:
该实现也不需要自定义函数,但简洁度和运行效率都不如tomin <- apply(simplify2array(rawval), 1, min, na.rm = TRUE)pmin的方案,更推荐使用前者。
内容的提问来源于stack exchange,提问作者Michael Roswell
相关产品推荐
相关产品推荐

