Группировка по дню, идентификатору и сумме - PullRequest
1 голос
/ 01 апреля 2020

У меня есть набор данных, который я хотел бы сгруппировать по дням, а также суммировать на основе идентификатора

df:

ID                     Duration            Date

A                      5                  9/9/2019 5:46:29 PM
A                      6                  9/9/2019 5:48:00 PM
A                      6                  9/9/2019 6:00:05 PM
B                      2                  9/10/2019 1:00:01 PM
B                      2                  9/10/2019 1:30:00 PM

Желаемый результат:

ID               Date             Duration

A                9/9/2019         17
B                9/10/2019        4

Dput:

structure(list(ID = structure(c(1L, 1L, 1L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), Duration = c(5L, 6L, 6L, 2L, 2L), Date = structure(c(3L, 
4L, 5L, 1L, 2L), .Label = c("9/10/2020 1:00:01 AM", "9/10/2020 1:30:00 AM", 
"9/9/2019 5:46:29 PM", "9/9/2019 5:48:00 AM", "9/9/2019 6:00:05 AM"
), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))

Вот что я пробовал:

df %>%
group_by(Date = as.Date(mdy_hms(Date))) %>% 
summarise(Duration = sum(Duration))

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 01 апреля 2020

Как указано в комментарии, если вы включите ID в команду group_by, это даст вам то, что вам нужно.

library(dplyr)

df %>% 
    group_by(ID, Date = as.Date(lubridate::mdy_hms(Date))) %>% 
    summarise(Duration = sum(Duration))

Вы также можете сделать это в базе R:

aggregate(Duration~ID + Date, transform(df, 
      Date = as.Date(as.POSIXct(Date, format = "%m/%d/%Y %I:%M:%S %p", 
                                tz = "UTC"))), sum)

#  ID       Date Duration
#1  A 2019-09-09       17
#2  B 2020-09-10        4
1 голос
/ 01 апреля 2020

Опция с data.table

library(data.table)
library(lubridate)
setDT(df)[, .(Duration = sum(Duration)), by =  .(ID, as.Date(mdy_hms(Date)))]
1 голос
/ 01 апреля 2020

Почти получилось, просто добавьте идентификатор в групповую забаву:

df%>%
  group_by(ID,Date = as.Date(mdy_hms(Date))) %>% 
  summarise(Duration = sum(Duration))


#out
# A tibble: 2 x 3
# Groups:   ID [2]
#  ID    Date       Duration
#  <fct> <date>        <int>
#1 A     2019-09-09       17
#2 B     2020-09-10        4

...