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

如何用dplyr从多列的首个非NA值生成新列?

解决思路与代码实现

首先注意你的数据中"NA"是字符串类型,而非R原生的缺失值NA,第一步需要先将这些字符串转为真正的缺失值,并把列转为数值型,这样后续的缺失值处理函数才能正常工作。

步骤1:预处理数据

library(dplyr)

# 假设你的数据框名为df
df <- df %>%
  mutate(across(A:C, ~ ifelse(.x == "NA", NA_real_, as.numeric(.x))))

步骤2:生成New列(两种方法)

方法一:使用coalesce函数(推荐)

coalesce函数的作用就是返回传入参数中第一个非缺失值,完美匹配你的需求:

df <- df %>%
  mutate(New = coalesce(A, B, C))

方法二:结合rowwise与c_across

如果一定要用across相关的语法,需要先通过rowwise()指定按行处理,再用c_across获取每行的A-C列值,最后提取第一个非NA值:

df <- df %>%
  rowwise() %>%
  mutate(New = first(na.omit(c_across(A:C)))) %>%
  ungroup() # 记得取消行分组,避免后续操作受影响

为什么之前用across没成功?

across本身是按列批量处理的函数,而你的需求是按行提取首个非NA值,属于行级操作,所以单独用across无法直接实现,需要搭配rowwise()或者使用coalesce这种原生支持行级非缺失值提取的函数。

内容的提问来源于stack exchange,提问作者Statistix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:00