You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用新列替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:47:37