所以我在一所学校有一个大型学生数据集,看起来像这样:
library(data.table)
set.seed(1)
school <- data.table("id" = rep(1:10, each = 10), "year" = rep(2000:2009, each = 10),
"grade" = sample(c(9:11, rep(NA, 5)), 100, replace = T))
我想做的是创建一个列,指示学生以前是否与现在处于同一年级。
此示例所需的输出可以在此处找到(我设置了一个链接以节省空间(。
这听起来可能很简单,但事实并非如此,因为学生可以回到年级,或者在前几年缺席。 我想要一种使用data.table
来做到这一点的方法,因为数据集非常大。到目前为止,我已经尝试了以下方法:
library(dplyr)
library(scales)
school[, repetition := any(school[censor((.I - 10):(.I + 10),
range = c(0, NROW(school))) %>% na.omit
][school[.I, id] == id] == grade)]
但是,这不起作用,因为我不知道如何区分"上层"(来自第一个school[...]
调用(运算符,如.I
和id
从第二个school[...]
调用内部。
PD:我会接受更好的标题的建议。谢谢!
我们可以使用duplicated
来获取每个id
和year
重复的成绩的逻辑值。
library(data.table)
school[, repetition := duplicated(grade, incomparables = NA), .(id, year)]