Подмножество и переименование данных на основе условия, а также найти продолжительность в Dplyr - PullRequest
1 голос
/ 30 января 2020

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

В конечном счете, я хотел бы иметь возможность сгруппировать данные в «чанки», где в столбце «Папка» содержится строка «Out», с учетом того, что DATE связано с. Есть ли способ создать чанк для каждого экземпляра, который происходит 'Out', при вычислении его продолжительности.

  Folder               DATE
  Out                  9/9/2019 5:46:00                
  Out                  9/9/2019 5:46:01
  Out                  9/9/2019 5:46:02
  In                   9/9/2019 5:46:03
  In                   9/9/2019 5:46:04
  Out                  9/10/2019 6:00:01
  Out                  9/10/2019 6:00:02
  In                   9/11/2019 7:50:00
  In                   9/11/2019 7:50:01

Я хотел бы этот вывод:

 New Variable        Duration
 Out1                 2 sec
 Out2                 1 sec

Я включил dput:

structure(list(Folder = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 2L, 
1L, 1L), .Label = c("In", "Outdata"), class = "factor"), Date =  structure(c(3L, 
3L, 3L, 3L, 3L, 1L, 1L, 2L, 2L), .Label = c("9/10/2019 6:00", 
"9/11/2019 7:50", "9/9/2019 5:46"), class = "factor")), class = "data.frame", row.names = c(NA,      
-9L))

То, что я пробовал до сих пор:

 #Loading appropriate libraries

 library(dplyr)
 library(lubridate)

создание новой переменной, которая сначала сгруппирует папку по строке 'Out'

(однако это то, где я не уверен, что делать, потому что я sh создаю новую переменную для каждой группы 'Out' и ее продолжительность, чтобы в конечном итоге отобразить это на гистограмме.)

 newdf<-df %>%
 group_by(df$Folder) %>%            
 summarise(mutate(Duration = difftime(as.POSIXct(ss_EndTime, format = 
 "%m/%d/%Y %I:%M:%S %p"),as.POSIXct(ss_StartTime, 
 format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs")))

Я буду продолжать исследования, все предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Мы можем сделать это с lubridate/rleid

library(dplyr)
library(lubridate)
library(data.table)
library(stringr)
df %>% 
    mutate(DATE = mdy_hms(DATE), grp = rleid(Folder)) %>% 
    filter(Folder == "Out") %>%
    group_by(grp) %>% 
    summarise(Duration = diff(range(DATE))) %>% 
    mutate(grp = str_c("Out", row_number()))
# A tibble: 2 x 2
#  grp   Duration
#  <chr> <drtn>  
#1 Out1  2 secs  
#2 Out2  1 secs  

Или с помощью того же с data.table

setDT(df)[, grp := rleid(Folder)][Folder == 'Out',
    .(Duration = diff(range(mdy_hms(DATE)))), .(grp = paste0("Out", grp))]

data

df <- structure(list(Folder = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 2L, 
1L, 1L), .Label = c("In", "Out"), class = "factor"), DATE = structure(c(5L, 
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L), .Label = c("9/10/2019 6:00:01", 
"9/10/2019 6:00:02", "9/11/2019 7:50:00", "9/11/2019 7:50:01", 
"9/9/2019 5:46:00", "9/9/2019 5:46:01", "9/9/2019 5:46:02", "9/9/2019 5:46:03", 
"9/9/2019 5:46:04"), class = "factor")), class = "data.frame", 
row.names = c(NA, -9L))
1 голос
/ 30 января 2020

Мы можем преобразовать столбец DATE в POSIXct, создать столбец группировки на основе последовательного появления значений Folder, filter только "Out" значений и получить разницу между first и last время в каждой группе.

library(dplyr)

df %>%
  mutate(DATE = as.POSIXct(DATE, format = "%m/%d/%Y %H:%M:%S"), 
         gr = cumsum(Folder != lag(Folder, default = TRUE))) %>%
   filter(Folder == "Out") %>%
   arrange(gr, DATE) %>%
   group_by(gr) %>%
   summarise(Duration = difftime(last(DATE), first(DATE))) %>%
   mutate(gr = paste0('Out', row_number()))

# A tibble: 2 x 2
#  gr    Duration
#  <chr> <drtn>  
#1 Out1  2 secs  
#2 Out2  1 secs  

данные

df <- structure(list(Folder = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 2L, 
1L, 1L), .Label = c("In", "Out"), class = "factor"), DATE = structure(c(5L, 
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L), .Label = c("9/10/2019 6:00:01", 
"9/10/2019 6:00:02", "9/11/2019 7:50:00", "9/11/2019 7:50:01", 
"9/9/2019 5:46:00", "9/9/2019 5:46:01", "9/9/2019 5:46:02", "9/9/2019 5:46:03", 
"9/9/2019 5:46:04"), class = "factor")), class = "data.frame", 
row.names = c(NA, -9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...