如何用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
相关产品推荐
相关产品推荐

