выбор первой даты для каждого отдельного 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 ответ:
По тому, что вы описываете, если ваш индекс еще не заполнен, используйте следующее:
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]