Group_by и создайте новый столбец с продолжительностью - PullRequest
3 голосов
/ 31 января 2020

У меня есть набор данных, df,

  Subject      Folder      Message    Date
  A            Out                   9/9/2019 5:46:38 PM
  A            Out                   9/9/2019 5:46:40 PM
  A            Out                   9/9/2019 5:46:42 PM
  B            Out                   9/9/2019 5:48:00 PM
  B            Out                   9/9/2019 5:48:01 PM
  C            Out                   9/10/2019 5:49:01 PM

Как сгруппировать это по теме, а затем найти продолжительность при создании нового столбца Длительность. Это мой желаемый вывод:

  Subject   Duration    Group
  A         4 sec      outdata1
  B         1 sec      outdata2
  C         0 sec      outdata3

Вот мой dput:

         structure(list(Subject = structure(c(1L, 1L, 1L, 2L, 2L, 3L), .Label =                 c("A", 
         "B", "C"), class = "factor"), Folder = structure(c(1L, 1L, 1L, 
         1L, 1L, 1L), .Label = "Out", class = "factor"), Message = c("", 
         "", "", "", "", ""), Date = structure(c(2L, 3L, 4L, 5L, 6L, 1L
         ), .Label = c("9/10/2019 5:49:01 PM", "9/9/2019 5:46:38 PM", 
         "9/9/2019 5:46:40 PM", "9/9/2019 5:46:42 PM", "9/9/2019 5:48:00 PM", 
         "9/9/2019 5:48:01 PM"), class = "factor")), row.names = c(NA, 
         -6L), class = "data.frame")

Это то, что я пытался:

df %>%  
mutate(Date = mdy_hms(Date)) %>% 
transmute(Subject, Duration = diff = difftime(as.POSIXct(Date, format = 
"%m/%d/%Y %I:%M:%S %p"),as.POSIXct(Date, 
format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs")) %>% 
ungroup %>% 
distinct %>% 
mutate(grp = str_c("Outdata", row_number()))

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

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Здесь мы можем использовать группу по «Субъекту» до шага summarise

library(dplyr)
library(lubridate)
library(stringr)
df %>%
   mutate(Date = mdy_hms(Date)) %>% 
   group_by(Subject) %>%
   summarise(Duration = diff(range(Date))) %>% 
   mutate(grp = str_c("Outdata", row_number()))
# A tibble: 3 x 3
#  Subject Duration grp     
#  <fct>   <drtn>   <chr>   
#1 A       4 secs   Outdata1
#2 B       1 secs   Outdata2
#3 C       0 secs   Outdata3

Если нам нужно контролировать unit, используйте difftime

df %>%
    mutate(Date = mdy_hms(Date)) %>%
    group_by(Subject) %>%
    summarise(Duration = difftime(max(Date), min(Date), unit = 'sec')) %>%
    mutate(grp = str_c("Outdata", row_number()))
2 голосов
/ 31 января 2020

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

df$Date <- as.POSIXct(df$Date, format = "%m/%d/%Y %I:%M:%S %p")

transform(aggregate(Date~Subject, df, function(x) 
           difftime(max(x), min(x), units = "secs")), 
          Group = paste0('outdata', seq_along(Subject)))

#  Subject Date    Group
#1       A   4  outdata1
#2       B   1  outdata2
#3       C   0  outdata3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...