Разница между первой датой и последней датой в пределах одного человека в R

Добрый день, я не пользователь R, но мне нужно получить разницу между первой датой и последней датой в RFID, чтобы создать новый столбец X. Следовательно, первое значение должно быть 1 (не ноль), второе 2, ..., н.

Вот пример данных.

Заранее спасибо.

RFID              visit_date   ADFI   location
985152014315936   2017-11-25   2133   16
985152014315936   2017-11-26   2186   16
985152014315936   2017-11-27   3489   16
985152014315936   2017-11-28   2432   16
985152014315937   2017-11-24     15   17
985152014315937   2017-11-25   1512   17
985152014315937   2017-11-26   2378   17
985152014315937   2017-11-27   3241   17
985152014315938   2017-11-24    584   17
985152014315938   2017-11-25   1689   17
985152014315938   2017-11-26   2807   17
985152014315938   2017-11-27   2369   17
985152014315938   2017-11-28   2576   17
985152014315939   2017-11-25   1084   17
985152014315939   2017-11-26   3489   17
985152014315939   2017-11-27   2630   17
985152014315939   2017-11-28   3585   17
985152014315939   2017-11-29   3433   17
985152014315939   2017-11-30   2962   17

2 ответа

Вот решение с использованием dplyr а также lubridate:

require(tidyverse);
require(lubridate);

df %>% group_by(RFID) %>% mutate(X = max(ymd(visit_date)) - min(ymd(visit_date)));
## A tibble: 19 x 5
## Groups:   RFID [4]
#              RFID visit_date  ADFI location X
#             <dbl> <fct>      <int>    <int> <time>
# 1 985152014315936 2017-11-25  2133       16 3
# 2 985152014315936 2017-11-26  2186       16 3
# 3 985152014315936 2017-11-27  3489       16 3
# 4 985152014315936 2017-11-28  2432       16 3
# 5 985152014315937 2017-11-24    15       17 3
# 6 985152014315937 2017-11-25  1512       17 3
# 7 985152014315937 2017-11-26  2378       17 3
# 8 985152014315937 2017-11-27  3241       17 3
# 9 985152014315938 2017-11-24   584       17 4
#10 985152014315938 2017-11-25  1689       17 4
#11 985152014315938 2017-11-26  2807       17 4
#12 985152014315938 2017-11-27  2369       17 4
#13 985152014315938 2017-11-28  2576       17 4
#14 985152014315939 2017-11-25  1084       17 5
#15 985152014315939 2017-11-26  3489       17 5
#16 985152014315939 2017-11-27  2630       17 5
#17 985152014315939 2017-11-28  3585       17 5
#18 985152014315939 2017-11-29  3433       17 5
#19 985152014315939 2017-11-30  2962       17 5

Пример данных

df <- read.table(text =
    "RFID              visit_date   ADFI   location
985152014315936   2017-11-25   2133   16
985152014315936   2017-11-26   2186   16
985152014315936   2017-11-27   3489   16
985152014315936   2017-11-28   2432   16
985152014315937   2017-11-24     15   17
985152014315937   2017-11-25   1512   17
985152014315937   2017-11-26   2378   17
985152014315937   2017-11-27   3241   17
985152014315938   2017-11-24    584   17
985152014315938   2017-11-25   1689   17
985152014315938   2017-11-26   2807   17
985152014315938   2017-11-27   2369   17
985152014315938   2017-11-28   2576   17
985152014315939   2017-11-25   1084   17
985152014315939   2017-11-26   3489   17
985152014315939   2017-11-27   2630   17
985152014315939   2017-11-28   3585   17
985152014315939   2017-11-29   3433   17
985152014315939   2017-11-30   2962   17", header = T)

Использование data.table:

data <- data.table(data)
data[, diff := max(as.Date(visit_date)) - min(as.Date(visit_date)), by = RFID]

из если вы хотите добавить 1:

data[, diff := max(as.Date(visit_date)) - min(as.Date(visit_date)) + 1, by = RFID]
Другие вопросы по тегам