R中对data.frame多列应用OR运算且正确保留缺失值的方案
R 自定义OR运算处理NA的最优实现
基础R向量化实现(无需第三方包)
你原来的思路是对的,但可以用rowSums替换逐行apply,运算效率更高,代码也更简洁:
myOR <- function(df) { # 存在1则标记为1,无1则标记为0 res <- as.numeric(rowSums(df == 1, na.rm = TRUE) > 0) # 所有值均为NA的行替换为NA res[rowSums(is.na(df)) == ncol(df)] <- NA return(res) }
测试输出完全匹配你的预期:
myOR(df) # [1] 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 NA
更易读的dplyr实现
如果你已经在项目中使用tidyverse栈,可以用dplyr 1.0.0及以上版本内置的if_any/if_all函数,可读性更强:
library(dplyr) df <- df %>% mutate( xyz = as.numeric(if_any(everything(), ~.x == 1)), # 全NA行替换为NA xyz = ifelse(if_all(everything(), is.na), NA, xyz) )
避免重复复制代码的方案
- 把上述函数写入你本地的
~/.Rprofile配置文件,每次启动R会话会自动加载,可直接调用 - 把常用工具函数打包成个人R包,本地安装后全环境可用
内容的提问来源于stack exchange,提问作者kimena
相关产品推荐
相关产品推荐

