使用r中的规范对长数据进行切片

如果我有看起来像这样的数据

id<-c(1,1,1,1,2,2,2,3,3,3,3,4,4,4,5,5,5,5,5)
age<-c(12,14,15,16,12,13,14,14,16,17,19,12,13,14,15,16,18,20,21)
grade<-c('B','C','C','A','D','B','B','A','B','A','A','D','F','B','F','F','B','B','C')
data<-data.frame(id,age,grade)

假设 ID 是每个学生 (1:5) 在不同时间测量他们的成绩,我想看看他们在获得第一个 B 后在什么年龄发生了随后的成绩变化。 对于 12 岁获得 B 的学生 1,他/她在 14 岁时获得了 C,这是直接的。然而,对于学生 5,他/她在 18 岁时第一次获得了 B,然后在 20 岁时再次获得了 B,所以一年级的变化发生在 21 岁,也就是 C。

我认为切片将是最好的选择。

data %>% group_by(id,grade) %>% slice(which.min(age))

但我不确定如何包括接下来的几行来捕捉 B 变成另一个等级的“年龄”(又不是 B)。

回答

一个data.table选项

setDT(data)[, .SD[first(which((1:.N) > first(which(grade == "B")) &
           grade != "B"))], id]

   id age grade
1:  1  14     C
2:  3  17     A
3:  5  21     C


以上是使用r中的规范对长数据进行切片的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>