R语言如何提取DataFrame末尾连续NA前的最后一个非NA值
R语言提取列末尾连续NA前最后一个非NA值的实现方法
实现逻辑
不需要额外判断列末尾是否存在连续NA,直接按以下通用逻辑处理即可覆盖两种规则:
- 先提取目标列所有非NA值的位置索引
- 取索引列表的最大值,对应位置的元素就是需求的目标值
- 边界补充:如果整列全为NA,直接返回NA即可
代码实现
基础R实现(无需额外安装包,通用性最高)
# 示例1:列末尾为连续NA asd1 <- data.frame(a = c(1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,NA)) res1 <- asd1$a[max(which(!is.na(asd1$a)))] print(res1) # 输出结果为77 # 示例2:列末尾为非NA值 asd2 <- data.frame(a = c(1,2,NA,3,NA,NA,6,8,3,2,5,6,77,NA,NA,NA,NA,NA,NA,NA,65,56)) res2 <- asd2$a[max(which(!is.na(asd2$a)))] print(res2) # 输出结果为56
封装通用函数
如果需要频繁调用,可以封装为适配任意向量的函数:
get_last_non_na <- function(x) { non_na_idx <- which(!is.na(x)) # 处理全列都是NA的边界情况 if(length(non_na_idx) == 0) return(NA) return(x[max(non_na_idx)]) } # 调用测试 get_last_non_na(asd1$a) get_last_non_na(asd2$a)
dplyr版本实现(适配管道操作场景)
library(dplyr) asd1 %>% summarise(last_non_na = last(a[!is.na(a)])) %>% pull(last_non_na)
内容的提问来源于stack exchange,提问作者manu p
相关产品推荐
相关产品推荐

