R语言跨多列忽略NA值执行条件判断生成标记列的实现方法
R脚本实现方案
首先构造测试数据框:
# 构造原始数据 x <- c(1, 1, 2, 3, 4, 5) y <- c(1, 1, 1, 3, 4, 5) z <- c(NA, 1, 1, 3, 4, NA) df <- data.frame(x, y, z)
方法1:基础R实现
逐行遍历判断,逻辑直观无额外依赖:
# 生成flag1:所有非NA值均为1则标记1,否则0 df$flag1 <- apply(df, 1, function(row) { as.integer(all(row[!is.na(row)] == 1)) }) # 生成flag2:任意非NA值等于4则标记1,否则0 df$flag2 <- apply(df, 1, function(row) { as.integer(any(row[!is.na(row)] == 4)) })
方法2:tidyverse生态实现
适合日常管道流编码习惯:
library(dplyr) df <- df %>% rowwise() %>% mutate( # 筛选x到z列的非NA值做全匹配判断 flag1 = as.integer(all(c_across(x:z)[!is.na(c_across(x:z))] == 1)), # 筛选x到z列的非NA值做任意匹配判断 flag2 = as.integer(any(c_across(x:z)[!is.na(c_across(x:z))] == 4)) ) %>% ungroup()
输出结果验证
两种方法运行后得到的最终数据框如下,符合需求规则:
x y z flag1 flag2 1 1 1 NA 1 0 2 1 1 1 1 0 3 2 1 1 0 0 4 3 3 3 0 0 5 4 4 4 0 1 6 5 5 NA 0 0
内容的提问来源于stack exchange,提问作者ssjjaca
相关产品推荐
相关产品推荐

