Найдите количество дней по условию из другого столбца, R

У меня есть один фрейм данных:

Ptt      Date                      Area        
88734    2016-10-23 05:39:18       BA             
88734    2016-10-23 06:53:13       BA           
88734    2016-11-09 08:32:18       MI            
88734    2016-11-19 06:45:27       MI           
88734    2016-12-20 12:30:43       MI           
88734    2016-12-29 02:45:35       FA             
129041   2017-10-05 04:55:24       BA            
129041   2016-10-23 06:45:30       MI            
129041   2016-11-16 07:10:32       FA            
129041   2016-11-29 03:43:54       FA           
120941   2017-01-02 14:54:39       FA           
...

И я хочу посчитать, сколько дней у каждого Ptt есть в каждом area, но я понятия не имею, как это сделать, кто-нибудь знает, как?

Я ожидал, что это:

Ptt      Date                      Area        Days
88734    2016-10-23 05:39:18       BA           1  
88734    2016-10-23 06:53:13       BA           1
88734    2016-11-09 08:32:18       MI           1 
88734    2016-11-19 06:45:27       MI           2
88734    2016-12-20 12:30:43       MI           3
88734    2016-12-29 02:45:35       FA           1  
129041   2017-10-05 04:55:24       BA           1 
129041   2016-10-23 06:45:30       MI           1 
129041   2016-11-16 07:10:32       FA           1 
129041   2016-11-29 03:43:54       FA           2
120941   2017-01-02 14:54:39       FA           3
...
dt = data.table(Ptt= c("88734", "88734", "88734", "88734", "88734", "88734", "120941", "120941","120941","120941","120941"),
                date = c("2016-10-23 05:39:18",
                         "2016-10-23 06:53:13 ", 
                         "2016-11-09 08:32:18",
                         "2016-11-19 06:45:27",
                         "2016-12-20 12:30:43",
                         "2016-12-29 02:45:35",
                         "2017-10-05 04:55:24",
                         "2016-10-23 06:45:30",
                         "2016-11-16 07:10:32",
                         "2016-11-29 03:43:54",
                         "2017-01-02 14:54:39"),
                Area = c("BA", "BA", "MI", "MI", "MI", "FA", "BA", "MI", "FA", "FA", "FA"))

ИЗМЕНИТЬ

Я не очень хорошо объяснил.

Итак, я хочу знать, сколько дней у каждого Ptt есть в каждом Area Например: 88734 есть 1 день в BA, 3 дня в MI и 1 день в FA и так далее.

Я хочу это:

Ptt      Area        Days
88734    BA           1
88734    MI           3 
88734    FA           1  
129041   BA           1 
129041   MI           1 
120941   FA           3

Спасибо!


person Érika Soares Coelho    schedule 22.06.2020    source источник
comment
88734 have 2 days at BA. Можете ли вы объяснить, как вы считаете дни?   -  person Ronak Shah    schedule 23.06.2020
comment
Извините моя ошибка   -  person Érika Soares Coelho    schedule 23.06.2020
comment
Я знаю, но пытаюсь понять непонятную мне логику расчета.   -  person Ronak Shah    schedule 23.06.2020
comment
ах, я не рассчитывал, я хочу такой результат, я тоже не знаю, как это сделать   -  person Érika Soares Coelho    schedule 23.06.2020
comment
Я не спрашиваю вас, как это сделать. Прошу объяснить логику расчета Days. Почему первое значение равно 1, второе значение равно 3 и т. д.?   -  person Ronak Shah    schedule 23.06.2020
comment
потому что 1 день зарегистрирован в BA , 3 разных в MI и 1 в AA, во фрейме данных в сообщении   -  person Érika Soares Coelho    schedule 23.06.2020
comment
# 3 88734 2016-11-09 08:32:18 MI 1 # 4 88734 2016-11-19 06:45:27 MI 2 # 5 88734 2016-12-20 12:30:43 MI 3 три дня в MI   -  person Érika Soares Coelho    schedule 23.06.2020
comment
Вам нужно dt %>% count(Ptt, Area) ?   -  person Ronak Shah    schedule 23.06.2020
comment
нет.. это длина, например, у меня есть 3 повторяющихся дня для 88734, например, 08.10, 08.10, 08.10, а затем 15.10, 15.10 (здесь 2 повторяющихся дня), а затем 17.10, 17.10, 17.10, 17.10 (здесь повторяется 4 дня). Таким образом, у этих 88734 всего 3 дня, а не 9 дней.   -  person Érika Soares Coelho    schedule 23.06.2020
comment
Я думаю, вам следует задать новый вопрос со всеми этими подробностями. Я с трудом понимаю это. Мой ответ дал результат, который вы изначально опубликовали, но, возможно, это не то, что вы искали.   -  person Ronak Shah    schedule 23.06.2020
comment
я тебя поблагодарю!   -  person Érika Soares Coelho    schedule 23.06.2020


Ответы (1)


Вы можете преобразовать столбец date в POSIXct и извлечь из него дату. Каждому Ptt и Area можно присвоить уникальный номер для каждой даты.

library(dplyr)

dt %>%
  mutate(date = lubridate::ymd_hms(date), 
         date1 = as.Date(date)) %>%
  group_by(Ptt, Area) %>%
  mutate(Days = dense_rank(date1)) %>%
  ungroup() %>%
  select(-date1)

#  Ptt    date                Area   Days
#   <chr>  <dttm>              <chr> <int>
# 1 88734  2016-10-23 05:39:18 BA        1
# 2 88734  2016-10-23 06:53:13 BA        1
# 3 88734  2016-11-09 08:32:18 MI        1
# 4 88734  2016-11-19 06:45:27 MI        2
# 5 88734  2016-12-20 12:30:43 MI        3
# 6 88734  2016-12-29 02:45:35 FA        1
# 7 120941 2017-10-05 04:55:24 BA        1
# 8 120941 2016-10-23 06:45:30 MI        1
# 9 120941 2016-11-16 07:10:32 FA        1
#10 120941 2016-11-29 03:43:54 FA        2
#11 120941 2017-01-02 14:54:39 FA        3

Поскольку у вас есть data.table, вы также можете сделать это, используя синтаксис data.table:

library(data.table)

dt[, date := lubridate::ymd_hms(date)]
dt[, date1 := as.Date(date)]
dt[, Days := match(date1, unique(date1)), .(Ptt, Area)]
person Ronak Shah    schedule 22.06.2020
comment
Спасибо @Ronak Shah, но как я могу найти это количество дней для каждого ptt и области? Я предполагаю, что не оставил все объясненным, извините! Например, у 88734 было 12 дней в BA, 45 в MI и 60 в FA? Я пробовал dt%>% group_by(Ptt, Area, Days) %>% summarise(days.length = length(Days), maxi.days = max(Days)), но не получилось - person Érika Soares Coelho; 22.06.2020
comment
@ÉrikaSoaresCoelho Но это не то, что вы показали в ожидаемом результате? Как 88734 проводит 12 дней в BA? Вам нужно max(date) - min(date) для каждого Ptt и Area ? - person Ronak Shah; 23.06.2020
comment
Это был пример для 88734, потому что мои реальные данные содержат более 90 000 строк, поэтому мне нужно было знать, сколько дней у каждого Ptt есть в каждом Area. Например, в результате у 88734 было 12 дней в BA, 45 в MI и 60 в FA, и так далее, у меня действительно 32 Ptt в моем реальном фрейме данных. - person Érika Soares Coelho; 23.06.2020