如何用dplyr在纵向数据中创建标识最后与倒数第二行的新列
问题:为纵向数据添加倒数第二次访视标识列
我有长格式的纵向数据,每个个体由ID标识,对应多次访视(Visit)观测,且每个个体的观测数量不一致。已经成功创建了标识最后一次访视的lastVisit列,现在需要创建标识倒数第二次访视的secondlastVisit列。
示例数据
ID <- c(1000,1000,1000,1001,1001,1001,1001,1002,1002,1002,1002,1002) Visit <- c("BL","V02","V03","BL","V02","V03","V04","BL","V02","V03","V04","V05") df <- data.frame(ID,Visit)
已实现的代码(创建lastVisit列)
df <- df %>% group_by(ID) %>% mutate(lastVisit = last(Visit))
期望输出
ID Visit lastVisit secondlastVisit 1000 BL V03 V02 1000 V02 V03 V02 1000 V03 V03 V02 1001 BL V04 V03 1001 V02 V04 V03 1001 V03 V04 V03 1001 V04 V04 V03 1002 BL V05 V04 1002 V02 V05 V04 1002 V03 V05 V04 1002 V04 V05 V04 1002 V05 V05 V04
我尝试过用secondlastVisit = lag(Visit),但无法得到期望结果,优先采用dplyr::mutate的实现方法。
解决方案
可以利用dplyr的nth()函数,结合分组操作获取倒数第二次的访视值。n()能返回当前分组内的观测数量,n()-1即可定位到倒数第二个位置:
library(dplyr) df <- df %>% group_by(ID) %>% mutate( lastVisit = last(Visit), secondlastVisit = nth(Visit, n() - 1) ) %>% ungroup()
补充说明
如果数据中存在仅1条观测的个体,n()-1会等于0,此时nth()会返回NA,可以通过ifelse添加处理逻辑:
df <- df %>% group_by(ID) %>% mutate( lastVisit = last(Visit), secondlastVisit = ifelse(n() >= 2, nth(Visit, n()-1), NA) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者jonandet
相关产品推荐
相关产品推荐

