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

R语言中按ID提取每行最后一个非NA观测值的实现方法

提取每行最后一个非NA观测值的R解决方案

嘿,作为R新手碰到这种问题真的很正常,我来帮你轻松搞定!首先咱们先把你的示例数据整理成R里能直接运行的格式,然后给你两种简单的方法:

第一步:构造示例数据

先把你给出的输入数据转换成R的data.frame,这样咱们能直接测试代码:

df <- data.frame(
  Participant = 1:4,
  x1 = c(10, 5, 5, 20),
  x2 = c(NA, 15, 20, NA),
  x3 = c(NA, NA, 30, NA)
)

方法1:用R基础功能(无需额外安装包)

咱们可以用apply()函数逐行处理数据,提取每行最后一个非NA值:

# 给数据框新增x_final列
df$x_final <- apply(df[, c("x1", "x2", "x3")], 1, function(row) {
  # 先过滤掉当前行的NA值
  non_na_values <- na.omit(row)
  # 如果过滤后还有值,取最后一个;否则返回NA(处理全NA的情况)
  if (length(non_na_values) > 0) {
    non_na_values[length(non_na_values)]
  } else {
    NA
  }
})

方法2:用tidyverse工具集(新手友好,代码更易读)

如果你愿意安装并使用tidyverse(一套专门处理数据的R包),代码会更直观:
首先先安装并加载需要的包(第一次用的话需要安装):

# 第一次使用时安装tidyverse
install.packages("tidyverse")
# 加载dplyr和tidyr(tidyverse里的核心包)
library(dplyr)
library(tidyr)

然后用管道语法来处理数据:

df <- df %>%
  # 告诉R接下来要按行处理数据
  rowwise() %>%
  # 新增x_final列:提取x1到x3的所有值,去掉NA,然后取最后一个
  mutate(x_final = last(na.omit(c_across(x1:x3)))) %>%
  # 取消按行处理的设置(避免后续操作出错)
  ungroup()

运行后的结果

不管用哪种方法,你都会得到期望的输出:

> df
  Participant x1 x2 x3 x_final
1           1 10 NA NA      10
2           2  5 15 NA      15
3           3  5 20 30      30
4           4 20 NA NA      20

这个方法还能处理极端情况——如果某一行的x1、x2、x3全是NA,x_final会自动设为NA,非常安全!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:56