Если ID имеет несколько значений START и STOP, переместите их в новые столбцы START и STOP. если ID имеет 5 значений START и STOP, тогда ID должен содержать все значения в одной строке. с 5 START и 5 STOP. ID имеет максимум 7 значений.

Текущий DF.

ID        |       START           |     STOP

LB1    2020-04-01 03:46:03   2020-04-01 04:27:30

LB1    2020-04-01 10:07:08    2020-04-01 10:40:10

LB2    2020-04-02 17:01:23    2020-04-02 17:40:50

LB3   2020-04-03 17:04:56    2020-04-03 17:38:47

LB4    2020-04-04 18:35:34     2020-04-04 19:11:05
 
LB4    2020-04-06 09:48:07     2020-04-06 10:24:10

Ожидаемый результат

ID        |      START              |      STOP          |     START                |      STOP               |START           |     STOP   


LB1  2020-04-01 03:46:03     2020-04-01 04:27:30    2020-04-01 10:07:08   2020-04-01 10:40:10

LB2   2020-04-02 17:01:23   2020-04-02 17:40:50

LB3   2020-04-03 17:04:56   2020-04-03 17:38:47

LB4   2020-04-04 18:35:34    2020-04-04 19:11:05  2020-04-06 09:48:07     2020-04-06 10:24:10
r
-1
nick r 18 Сен 2020 в 00:32

2 ответа

Лучший ответ

Может быть, вы можете попробовать reshape + transform, когда с базой R

reshape(
  transform(
    df,
    q = ave(1:nrow(df), ID, FUN = seq_along)
  ),
  direction = "wide",
  idvar = "ID",
  timevar = "q"
)

Который дает

         ID             START.1              STOP.1             START.2
1 LB1            2020-04-01 03:46:03 2020-04-01 04:27:30 2020-04-01 10:07:08
3 LB2            2020-04-02 17:01:23 2020-04-02 17:40:50                <NA>
4 LB3            2020-04-03 17:04:56 2020-04-03 17:38:47                <NA>
5 LB4            2020-04-04 18:35:34 2020-04-04 19:11:05 2020-04-06 09:48:07
               STOP.2
1 2020-04-01 10:40:10
3                <NA>
4                <NA>
5 2020-04-06 10:24:10

Данные

> dput(df)
structure(list(ID = c("LB1", "LB1", "LB2", 
"LB3", "LB4", "LB4"), START = c("2020-04-01 03:46:03",
"2020-04-01 10:07:08", "2020-04-02 17:01:23", "2020-04-03 17:04:56", 
"2020-04-04 18:35:34", "2020-04-06 09:48:07"), STOP = c("2020-04-01 04:27:30",
"2020-04-01 10:40:10", "2020-04-02 17:40:50", "2020-04-03 17:38:47",
"2020-04-04 19:11:05", "2020-04-06 10:24:10")), class = "data.frame", row.names = c(NA,
-6L))
3
nick r 17 Сен 2020 в 22:36

Пара вариантов с использованием данных @ ThomasIsCoding.

С dplyr:

library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(row = row_number()) %>%
  tidyr::pivot_wider(names_from = row, values_from = c(START, STOP))

# ID    START_1             START_2             STOP_1              STOP_2             
#  <chr> <chr>               <chr>               <chr>               <chr>              
#1 LB1   2020-04-01 03:46:03 2020-04-01 10:07:08 2020-04-01 04:27:30 2020-04-01 10:40:10
#2 LB2   2020-04-02 17:01:23 NA                  2020-04-02 17:40:50 NA                 
#3 LB3   2020-04-03 17:04:56 NA                  2020-04-03 17:38:47 NA                 
#4 LB4   2020-04-04 18:35:34 2020-04-06 09:48:07 2020-04-04 19:11:05 2020-04-06 10:24:10

С data.table:

library(data.table)

dcast(setDT(df), ID~rowid(ID), value.var = c('START', 'STOP'))
0
Ronak Shah 18 Сен 2020 в 02:34