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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:57:27