Группировать и переименовывать на основе двух условий в R (dplyr) - PullRequest
1 голос
/ 30 января 2020

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

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

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

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

 New Variable        Duration        Message
 Outdata1              2 sec
 Outdata2              1 sec

Я включил dput:

dput(sample)
structure(list(Folder = structure(c(2L, 2L, 2L, 1L, 1L, 2L, 2L, 
1L, 1L), .Label = c("In", "Outdata"), class = "factor"), Date = structure(c(5L, 
6L, 7L, 8L, 9L, 1L, 2L, 3L, 4L), .Label = c("9/10/2019 6:00:01 AM", 
"9/10/2019 6:00:02 AM", "9/11/2019 7:50:00 AM", "9/11/2019 7:50:01 AM", 
"9/9/2019 5:46:00 AM", "9/9/2019 5:46:01 AM", "9/9/2019 5:46:02 AM", 
"9/9/2019 5:46:03 AM", "9/9/2019 5:46:04 AM"), class = "factor"), 
Message = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L), .Label = c("", 
"hello"), class = "factor")), class = "data.frame", row.names = c(NA, 
-9L))

Это то, что я попробовал, и это хорошо работает, мне просто нужно учитывать состояние пустых значений сообщения.

  library(dplyr)

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

Приведенный выше код работает нормально, но я не уверен, как выполнить условие, где row == ""

1 Ответ

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

Возможно, просто paste Message вместе в одной строке.

library(dplyr)

sample  %>%
  mutate(DATE = as.POSIXct(Date, format = "%m/%d/%Y %I:%M:%S %p"), 
         gr = cumsum(Folder != lag(Folder, default = TRUE))) %>%
  filter(Folder == "Outdata") %>%
  arrange(gr, DATE) %>%
  group_by(gr) %>%
  summarise(Duration = difftime(last(DATE), first(DATE), units = "secs"), 
            Message = paste0(Message, collapse = "")) %>%
  mutate(gr = paste0('Out', row_number()))
...