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

