Я новичок в R, и это мой первый вопрос по stackoverflow.
я стараюсь
- назначить по ссылке на новый столбец
- для каждого ряда
- используя значение из первой следующей строки в той же группе строк
- это соответствует условию.
Пример данных:
id code date_down date_up
1: 1 p 2019-01-01 2019-01-02
2: 1 f 2019-01-02 2019-01-03
3: 2 f 2019-01-02 2019-01-02
4: 2 p 2019-01-03 <NA>
5: 3 p 2019-01-04 <NA>
6: 4 <NA> 2019-01-05 2019-01-05
7: 5 f 2019-01-07 2019-01-08
8: 5 p 2019-01-07 2019-01-08
9: 5 p 2019-01-09 2019-01-09
10: 6 f 2019-01-10 2019-01-10
11: 6 p 2019-01-10 2019-01-10
12: 6 p 2019-01-10 2019-01-11
Что я хотел бы сделать, это
- подмножество (группа) по
id
- и для каждого ряда
- найти
date_up
для первого ряда ниже, - где
code = 'p'
иdate-up
(из найденной строки) больше, чемdate-down
для строки, которую я обновляю.
Мой ожидаемый результат должен быть:
id code date_down date_up founddate
1: 1 p 2019-01-01 2019-01-02 <NA>
2: 1 f 2019-01-02 2019-01-03 <NA>
3: 2 f 2019-01-02 2019-01-02 <NA>
4: 2 p 2019-01-03 <NA> <NA>
5: 3 p 2019-01-04 <NA> <NA>
6: 4 <NA> 2019-01-05 2019-01-05 <NA>
7: 5 f 2019-01-07 2019-01-08 2019-01-08
8: 5 p 2019-01-07 2019-01-08 2019-01-09
9: 5 p 2019-01-09 2019-01-09 <NA>
10: 6 f 2019-01-10 2019-01-10 2019-01-11
11: 6 p 2019-01-10 2019-01-10 2019-01-11
12: 6 p 2019-01-10 2019-01-11 <NA>
Я пробовал много вариантов, с помощью .SD
, .N
, создавая новый столбец с DT[, idcount:= seq_leg(.N),by=id]
, но на самом деле не получили в любом месте. Любая помощь с благодарностью.
Также любые хорошие ссылки на data.table :) Большое спасибо
Редактировать: я отредактировал предоставленные исходные данные, чтобы дать более тонкий пример, в котором строка 10 обновляется данными из строки 12, поскольку строка 12 находится в подмножестве идентификаторов и соответствует квалификационным критериям. Строка 11 не соответствует квалификационным критериям и, следовательно, данные не используются для обновления строки 10. Также включено мое первое использование dput
!
Пример данных в dput
кода dput
:
dt <- structure(list(
id = c(1L, 1L, 2L, 2L, 3L, 4L, 5L, 5L, 5L, 6L, 6L, 6L),
code = c("p", "f", "f", "p", "p", "<NA>", "f", "p", "p", "f", "p", "p"),
date_down = structure(c(17897, 17898, 17898, 17899, 17900, 17901, 17903, 17903, 17905, 17906, 17906, 17906), class = "Date"),
date_up = structure(c(17898, 17899, 17898, NA, NA, 17901, 17904, 17904, 17905, 17906, 17906, 17907), class = "Date")),
class = c("data.table", "data.frame"),
row.names = c(NA, -12L))
setDT(dt) # to reinit the internal self ref pointer (known issue)