У меня есть набор данных, состоящий из студентов (id
) и их оценки каждый год:
library(data.table)
set.seed(1)
students <- data.table("id" = rep(1:10, each = 10),
"year" = rep(2000:2009, 10),
"grade" = sample(c(9:11, rep(NA, 5)), 100, replace = T))
Вот образец для ученика 1:
id year grade
1: 1 2000 9
2: 1 2001 NA
3: 1 2002 NA
4: 1 2003 9
5: 1 2004 10
6: 1 2005 NA
7: 1 2006 NA
8: 1 2007 11
9: 1 2008 NA
Я хотел бы иметь возможность получить доступ к предыдущим и будущим ученикам для выполнения различных операций. Скажите, например, , например, , добавив последние три оценки учащегося. В результате будет получен такой набор данных:
id year grade sum_lag_3
1: 1 2000 9 9 # 1st window, size 1: 9
2: 1 2001 NA 9
3: 1 2002 NA 9
4: 1 2003 9 18 # 2nd, size 2: 9 + 9 = 18
5: 1 2004 10 28 # 3rd, size 3: 9 + 9 + 10 = 28
6: 1 2005 NA 28
7: 1 2006 NA 28
8: 1 2007 11 30 # 4th, size 3: 9 + 10 + 11 = 30
9: 1 2008 NA 30
10: 1 2009 10 31 # 5th, size 3: 10 + 11 + 10 = 31
11: 2 2001 11 11 # 1st window, size 1: 11
(все результаты будут выглядеть как это ).
- Это, однако, НЕ сообщение о предварительном формировании скользящей суммы.
- Я хочу иметь возможность в более общем плане выполнять предварительные операции в каждой группе, для этого мне нужно было бы найти способ сослаться на всех прошлых и будущих студентов оценки.
Таким образом, в случае первой строки, поскольку нет предыдущих наблюдений, это будет означать, что вектор «прошлое» пуст, а вектор «будущего» будет NA NA 9 10 NA NA 11 NA 10
.
Точно так же для второй строки вектор «прошлого» будет 9
, а вектор «будущего» будет:
NA 9 10 NA NA 11 NA 10
И для третьей строки ' вектор прошлого будет 9 NA
, а вектор будущего будет:
9 10 NA NA 11 NA 10
Это информация, которую я хочу использовать для различных вычислений. Расчеты, которые выполняются только внутри каждой группы и различаются в зависимости от контекста. Предпочтительно я хотел бы сделать это, используя data.table
и не преобразовывая мои данные в широкий формат.
Я пробовал сделать следующее:
students[, .SD[, sum_last_3:= ...], by = id]
, но получаю сообщение об ошибке сообщение о том, что эта функция еще не доступна на data.table
(где ... - это заполнитель для любой операции.).
Всем спасибо.