Это идеально подходит для data.table
: ваши данные имеют четко определенный ключ, который вы группируете по (patid,eventdate)
, вы знаете, что размер выходного df будет <= размер входного df, поэтому безопасно делайте назначения на месте (быстрее, быстрее) вместо добавлений, вам не нужно выводить iterative-append, а data.table имеет хорошую быструю <code>unique функцию. Поэтому, пожалуйста, попробуйте (без цикла!) Приведенный ниже код и дайте нам знать, как он сравнивается как с вашим исходным, так и с dplyr
подходом:
require(data.table)
dt = data.table(patid=c(1,1,2,3,3,3), eventdate=c('12/03/1998','12/03/1998',
'04/03/2007', '15/11/1980', '15/11/1980','01/02/1981'))
dt[, eventdate := as.POSIXct(eventdate,format="%d/%m/%Y") ]
# If you set a key, the `by` operation will be super-fast
setkeyv(dt, c('patid','eventdate'))
odt <- dt[, by=.(patid,eventdate)]
patid eventdate
1: 1 1998-03-12
2: 1 1998-03-12
3: 2 2007-03-04
4: 3 1980-11-15
5: 3 1980-11-15
6: 3 1981-02-01
(И последнее: не бойтесь POSIXct / lt, конвертируйте их раньше, они более эффективны, чем строки, они поддерживают операторы сравнения, поэтому столбец можно использовать в качестве ключа, сортировать по, сравнивать.)
(И для самой быстрой реализации dplyr
используйте dplyr::distinct()
)