R语言如何提取每行的最后一个非NA值?
嘿,作为R语言新手碰到这个需求太正常啦!我来给你分享几个简单易懂的方法,轻松搞定每行最后一个非NA值的提取,还能新增LastD列~
首先先把你的示例数据用代码还原出来,方便咱们测试:
# 构造示例数据框 df <- data.frame( Name = c("Stacy", "Joy", "Anna", "Ray", "Fey"), D1 = c(1, NA, NA, 2, 8), D2 = c(4, 4, NA, NA, NA), D3 = c(NA, 8, 7, 3, NA), D4 = c(6, NA, 1, NA, NA), D5 = c(NA, 8, NA, NA, NA) )
方法一:用tidyverse工具(推荐新手,语法直观)
如果你已经在用dplyr这类tidyverse包,这个方法可读性超强:
library(dplyr) df_result <- df %>% rowwise() %>% # 告诉R我们要按行处理数据 mutate( LastD = tail(na.omit(c_across(starts_with("D"))), 1) # c_across(starts_with("D")):选中所有以D开头的列(D1-D5) # na.omit():去掉这些列里的NA值 # tail(1):取剩下值的最后一个 ) %>% ungroup() # 关闭按行处理模式,恢复常规操作 # 查看结果 print(df_result)
方法二:基础R实现(不用额外加载包)
如果不想加载任何包,用基础R的apply函数也能快速搞定:
# 直接给原数据框新增LastD列 df$LastD <- apply(df[, -1], 1, function(x) { # df[, -1]:去掉第一列Name,只保留D1-D5 # apply(..., 1):按行执行后面的函数 non_na_vals <- na.omit(x) if (length(non_na_vals) == 0) { NA # 处理全是NA的行,返回NA } else { tail(non_na_vals, 1) } }) # 查看结果 print(df)
两种方法运行后都会得到你想要的结果:
Name D1 D2 D3 D4 D5 LastD 1 Stacy 1 4 NA 6 NA 6 2 Joy NA 4 8 NA 8 8 3 Anna NA NA 7 1 NA 1 4 Ray 2 NA 3 NA NA 3 5 Fey 8 NA NA NA NA 8
小提示:如果你的数据里有全是NA的行,上面的代码已经做了处理,会返回NA而不是报错哦~
内容的提问来源于stack exchange,提问作者Anisa Daraputri




