R语言:按ID提取变量最后一个非NA值并生成新变量
嗨,我来帮你搞定这个需求!首先得提个小细节:你原代码里的datvisit会被R当成数值计算(比如25/06/2014会变成一个小数),所以我先把它修正成日期类型,这样数据才符合实际意义。
第一步:修正数据框的日期格式
data0 <- data.frame( id = c("AH001","AH001","AH002","AH002","AH002","AH002","AH003","AH003","AH003","AH003"), numvisit = c(2,3,2,3,4,5,2,3,4,5), datvisit = as.Date(c("25/06/2014","24/07/2014","25/06/2014","24/07/2014","25/08/2014","26/09/2014","25/06/2014","24/07/2014","25/08/2014","26/09/2014"), format = "%d/%m/%Y"), weight = c(51.3,51.4,59.8,59.6,NA,NA,52.2,52.5,NA,NA), center = c(1,1,1,1,1,1,1,1,1,1) )
方法一:用dplyr(tidyverse风格)实现
这是现在最常用的分组处理方式,代码清晰易懂:
library(dplyr) data0 <- data0 %>% group_by(id) %>% # 提取每个id下非NA的weight,取最后一个值;如果全是NA则返回NA mutate(poidslast = last(weight[!is.na(weight)])) %>% ungroup()
方法二:用base R实现(无需额外包)
如果你不想加载tidyverse包,用base R的ave函数也能轻松搞定:
data0$poidslast <- ave(data0$weight, data0$id, FUN = function(x) tail(x[!is.na(x)], 1))
最终效果
运行完上面任意一种方法后,data0就会新增poidslast列:
- 所有
id=AH001的行,poidslast都是51.4(该id最后一个非NA的weight) - 所有
id=AH002的行,poidslast都是59.6 - 所有
id=AH003的行,poidslast都是52.5
内容的提问来源于stack exchange,提问作者Djamiou Dossa
相关产品推荐
相关产品推荐

