выбор первой даты для каждого отдельного R


Этот вопрос связан с этим постом Дайте каждому id одинаковое значение столбца R но решение там не работает для меня.

У меня есть datatable, где индекс - это первая дата, когда человек получил препарат C10.* ? в период между 2010-04-01 и 2010-09-30 гг.:
names   drugs      dates      index
1:  mary C10AA07 2009-10-01         NA
2:  mary C09AA03 2010-06-01         NA
3:  mary C10AA07 2010-07-01 2010-07-01
4:  mary A02BC01 2010-07-01         NA
5:  mary C10AA07 2010-07-24 2010-07-01
6:   tom C10AA05 2009-12-01         NA
7:   tom C10AA05 2010-04-06 2010-04-06
8:   tom C07AB03 2010-05-12         NA
9:   tom C10AA05 2010-08-01 2010-04-06
Я пытаюсь дать Мэри ее индексную дату для всех строк в столбце "индекс". и то же самое с Томом. так что вывод такой:
 names   drugs      dates      index
1:  mary C10AA07 2009-10-01 2010-07-01
2:  mary C09AA03 2010-06-01 2010-07-01
3:  mary C10AA07 2010-07-01 2010-07-01
4:  mary A02BC01 2010-07-01 2010-07-01
5:  mary C10AA07 2010-07-24 2010-07-01
6:   tom C10AA05 2009-12-01 2010-04-06
7:   tom C10AA05 2010-04-06 2010-04-06
8:   tom C07AB03 2010-05-12 2010-04-06
9:   tom C10AA05 2010-08-01 2010-04-06

Это именно то, в чем заключается проблема в ссылка размещена выше. Это строки кода, которые я пробовал, но каждый код дает мне пакет только все значения NA для индекса или же не изменяет мой dt2

Попытка 1:

dt2[, index := index[grepl('^C10.*?', as.character(dt2$drugs))& dt2$dates>="2010-04-01" & dt2$dates<"2010-10-01"][1], by = names]     
dt2

Попытка 2:

dt2[, index := index[grepl('^C10.*?', as.character(dt2$drugs))[1], by = names])
dt2
Я не могу понять, что происходит и почему код не работает. Если кто-то может пролить на это свет, это было бы здорово. Спасибо.

Попытка 3:

dt2[, index := index[drugs == 'C10AA05' & drugs=='C10AA07'][1], by = names]
dt2
1 2

1 ответ:

По тому, что вы описываете, если ваш индекс еще не заполнен, используйте следующее:

dt2[, index := min(dates[grepl("^C10", drugs)], na.rm=TRUE), by=names]

Если ваш индекс уже имеет правильное значение, и вы просто пытаетесь заполнить NA, используйте вместо этого следующее, Так как это будет быстрее

> dt2[, index := index[!is.na(index)][[1]], by=names]
> dt2
   names   drugs      dates      index
1:  mary C10AA07 2009-10-01 2010-07-01
2:  mary C09AA03 2010-06-01 2010-07-01
3:  mary C10AA07 2010-07-01 2010-07-01
4:  mary A02BC01 2010-07-01 2010-07-01
5:  mary C10AA07 2010-07-24 2010-07-01
6:   tom C10AA05 2009-12-01 2010-04-06
7:   tom C10AA05 2010-04-06 2010-04-06
8:   tom C07AB03 2010-05-12 2010-04-06
9:   tom C10AA05 2010-08-01 2010-04-06
> 

Если вы собираетесь делать это часто, я бы рекомендовал установить ключ в drugs или даже создать новый столбец с drugid. Обратите внимание, что вы можете использовать ключ в .SD, поэтому для вас будет работать следующее:

dt2[, drugid := substr(drugs, 1, 3)]
setkey(dt2, drugid)

## HAVE A LOOK AT THE OUTPUT
dt2[, .SD[.("C10"), min(dates)]]
dt2[, .SD[.("C10"), min(dates)], by=names]
dt2[, .SD[.("C10"), min(dates)]$V1, by=names]
dt2[, index := .SD[.("C10"), min(dates)]$V1, by=names]