r - 从长格式数据中获取下一个日期
问题描述
我有一个像这样工作的数据集:
id= c("A1", "A1", "B2", "C3", "C3", "C3")
move= c(1, 2, 1, 1, 2, 3)
max = c(2, 2, 1, 3, 3, 3)
date= c("1/1/1990", "1/4/1990", "1/1/1995", "4/1/1992", "6/1/1996", "1/1/1998")
df <-data.frame(id, move, date)
df$date <- as.Date(df$date,format = "%m/%d/%Y")
其中 id 代表一个人,move 代表一个移动顺序,date 代表移动发生的时间,max 是给定 id 进行的最大移动次数。
我想要的是下一个列,其中包含下一步的日期。
所以基本上,我想做的伪代码是:group.by(df$id),如果move < max,找到move+1的行并返回日期,否则返回NA
我希望最终看起来像这样:
id move max date next
1 A1 1 2 1/1/1990 1/4/1990
2 A1 2 2 1/4/1990 NA
3 B2 1 1 1/1/1995 NA
4 C3 1 3 4/1/1992 6/1/1996
5 C3 2 3 6/1/1996 1/1/1998
6 C3 3 3 1/1/1998 NA
该数据集有超过 8500 万个观测值和更多变量,所以我真的很想避免将它从长切换到宽,如果可能的话再切换回来!
解决方案
lead
我们可以使用包中的窗口函数dplyr
:
library(dplyr)
df %>%
group_by(id) %>%
mutate(next_move = lead(date))
输出:
id move date next_move
<chr> <dbl> <date> <date>
1 A1 1 1990-01-01 1990-01-04
2 A1 2 1990-01-04 NA
3 B2 1 1995-01-01 NA
4 C3 1 1992-04-01 1996-06-01
5 C3 2 1996-06-01 1998-01-01
6 C3 3 1998-01-01 NA
推荐阅读
- android-studio - 更新到 Flutter 1.22 后,VSCode 和 Android Studio 都无法找到文件参考
- javascript - 无法在检查器 html 编辑器中切换“启用 java”
- getelementbyid - 无法通过引导表中的 ID 获取元素值
- javascript - 使用 $('body').text() 时如何在元素之间添加空格?
- python - SyntaxError 文件“import.py”,第 14 行
- jquery - jQuery 数据表导出到带有 cell() 背景颜色的 excel
- android - 如何在 react-native git 项目中使用乘法项目实例处理乘法 .git 文件夹
- ffmpeg - 连接一个基本 mp4 文件 + 一堆 MP4 文件时出现 FFmpeg 错误\
- sql - 按任一列分组的 SQL 总和
- angular - 触发电子邮件谷歌 Firestore 扩展