如何用新列替换DataFrame的A:C列,标记行有无非缺失值?
问题描述
我有一个简化后的DataFrame,想要把A:C列替换为新列new_column:
- 当某行存在非缺失值时显示1
- 当某行全为缺失值时显示NA
示例输入:
A B C NA NA NA 1 0 0 0 1 0 0 0 1
期望输出:
new_column NA 1 1 1
我尝试用dplyr包的mutate命令实现,但没得到正确结果:
library(dplyr) df %>% mutate(new_column = apply(is.na(df[, c("A","B","C")]), 1, all), .keep = "unused", .before = "D" ) # where D is the next column in the data frame
修正后的解决方案
方案一:用dplyr原生函数(推荐)
用if_all结合case_when实现,更贴合dplyr的管道风格:
library(dplyr) df %>% mutate( new_column = case_when( if_all(A:C, is.na) ~ NA_real_, TRUE ~ 1L ), .keep = "unused", .before = "D" )
说明:
if_all(A:C, is.na):逐行检查A到C列是否全为缺失值,返回逻辑判断结果case_when根据判断结果赋值:全缺失时返回NA_real_(保证数值类型),否则返回整数1(1L).keep = "unused"自动移除原来的A:C列,只保留新列和其他列(比如D列).before = "D"控制新列插入到D列之前
方案二:基于apply调整逻辑
如果更习惯用apply,可以修改原代码的判断逻辑:
library(dplyr) df %>% mutate( new_column = ifelse(apply(select(., A:C), 1, \(x) all(is.na(x))), NA_real_, 1L), .keep = "unused", .before = "D" )
说明:
select(., A:C)在管道中选择目标列,避免直接引用原df,更符合管道语法apply(..., 1, \(x) all(is.na(x)))逐行判断是否全为缺失值ifelse根据判断结果赋值:全缺失时返回NA,否则返回1
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

