Необходимо сгруппировать / отсортировать, а затем выполнить операцию в том же столбце

#r

#r

Вопрос:

введите описание изображения здесь1- Для каждого номера детали, а также для каждого номера заказа (требуется некоторая группировка), мне нужно, чтобы данные были отсортированы в порядке возрастания, используя столбец при запуске времени

2- Затем мне нужно вычислить дельту между двумя ячейками из одного столбца (см. Рисунок ниже: B-A), затем создать новый столбец с именем Span.plus.Очередь

Причина, по которой мне нужно сортировать по возрастанию, заключается в том, что вычисление дельты всегда должно быть положительным

 structure(list(Order = c("100016572", "100016572", "100016572", 
"100049101", "100049101", "100049101", "100049101", "100049101", 
"100049101", "100049101"), Op = c(9997, 9997, 9997, 8391, 8392, 
8393, 8394, 8395, 8396, 8397), `Op Desc` = c("PPamp;C Movement / Go To Stock", 
"PPamp;C Movement / Go To Stock", "PPamp;C Movement / Go To Stock", 
"ASSEMBLY REWORK IAW 200365779", "MACHINE SHOP IAW 200365779", 
"ASSEMBLY REWORK IAW 200365779", "PPamp;C REWORK IAW 200365779", 
"INSPECT IAW 200365779", "ASSEMBLY REWORK IAW 200365779", "PPamp;C REWORK IAW 200365779"
), `Part No` = c("2352841G1-516", "2352841G1-516", "2352841G1-516", 
"2352841G1", "2352841G1", "2352841G1", "2352841G1", "2352841G1", 
"2352841G1", "2352841G1"), WBS = c("G-CUST-01", "G-CUST-01", 
"G-CUST-01", "G-6M76-01", "G-6M76-01", "G-6M76-01", "G-6M76-01", 
"G-6M76-01", "G-6M76-01", "G-6M76-01"), `Work Cntr` = c("26801702", 
"26801702", "26801702", "CHRP0000", "CHRP0000", "CHRP0000", "CHRP0000", 
"CHRI0000", "CHRP0000", "CHRP0000"), `On Time Start` = structure(c(1557852668.803, 
1557852668.803, 1557852668.803, 1579215738.477, 1579279874.08, 
1579598294.2, 1579625528.097, 1579690071.267, 1583883648.167, 
1584029686.74), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
    `On Time Comp` = structure(c(1585156034.313, 1585156034.313, 
    1585156034.313, 1579216621.723, 1579285486.47, 1579605490.21, 
    1579626040.097, 1583876924.857, 1584012522.213, 1584029801.71
    ), tzone = "UTC", class = c("POSIXct", "POSIXt")), Span_CDay = structure(c(316.011174884259, 
    316.011174884259, 316.011174884259, 0.0102227546302257, 0.0649582175938068, 
    0.0832871527776674, 0.00592592592592593, 48.4589535879647, 
    1.49159775462967, 0.00133067129662743), class = "difftime", units = "days")), row.names = c(NA, 
-10L), groups = structure(list(Order = c("100016572", "100049101"
), .rows = structure(list(1:3, 4:10), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = 1:2, class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))
 

Комментарии:

1. Не добавляйте rstudio тег для вопросов, связанных только с R. rstudio тег зарезервирован для вопросов, связанных с IDE RStudio.

2. Что такое RStudio IDE/

Ответ №1:

Я надеюсь, что вы получите то, что хотите с этим. Здесь mydf — это ваш фрейм данных.

 attach(mydf)
#Sort with ascending order
mydf[order(Order,`On Time Start`),]

#Add the new column for the delta and assigned NAs as initial values
mydf$Span.plus.Queue = NA_real_

#Compute the delta in days, and store the result in the new column
k = 1:nrow(mydf)
mydf$Span.plus.Queue[k]= ifelse(Order[k]== Order[k 1], difftime(`On Time Start`[k 1],`On Time Start`[k], unit = "days"), NA)
mydf

#  Order       Op `Op Desc`               `Part No`    WBS     `Work Cntr` `On Time Start`     `On Time Comp`      Span_CDay      Span.plus.Queue
   <chr>    <dbl> <chr>                   <chr>        <chr>   <chr>       <dttm>              <dttm>              <drtn>                   <dbl>
# 1 1000165~  9997 PPamp;C Movement / Go To ~ 2352841G1-5~ G-CUST~ 26801702    2019-05-14 16:51:08 2020-03-25 17:07:14 3.160112e 02 ~           0    
# 2 1000165~  9997 PPamp;C Movement / Go To ~ 2352841G1-5~ G-CUST~ 26801702    2019-05-14 16:51:08 2020-03-25 17:07:14 3.160112e 02 ~           0    
# 3 1000165~  9997 PPamp;C Movement / Go To ~ 2352841G1-5~ G-CUST~ 26801702    2019-05-14 16:51:08 2020-03-25 17:07:14 3.160112e 02 ~          NA    
# 4 1000491~  8391 ASSEMBLY REWORK IAW 20~ 2352841G1    G-6M76~ CHRP0000    2020-01-16 23:02:18 2020-01-16 23:17:01 1.022275e-02 ~           0.742
# 5 1000491~  8392 MACHINE SHOP IAW 20036~ 2352841G1    G-6M76~ CHRP0000    2020-01-17 16:51:14 2020-01-17 18:24:46 6.495822e-02 ~           3.69 
# 6 1000491~  8393 ASSEMBLY REWORK IAW 20~ 2352841G1    G-6M76~ CHRP0000    2020-01-21 09:18:14 2020-01-21 11:18:10 8.328715e-02 ~           0.315
# 7 1000491~  8394 PPamp;C REWORK IAW 200365~ 2352841G1    G-6M76~ CHRP0000    2020-01-21 16:52:08 2020-01-21 17:00:40 5.925926e-03 ~           0.747
# 8 1000491~  8395 INSPECT IAW 200365779   2352841G1    G-6M76~ CHRI0000    2020-01-22 10:47:51 2020-03-10 21:48:44 4.845895e 01 ~          48.5  
# 9 1000491~  8396 ASSEMBLY REWORK IAW 20~ 2352841G1    G-6M76~ CHRP0000    2020-03-10 23:40:48 2020-03-12 11:28:42 1.491598e 00 ~           1.69 
# 10 1000491~  8397 PPamp;C REWORK IAW 200365~ 2352841G1    G-6M76~ CHRP0000    2020-03-12 16:14:46 2020-03-12 16:16:41 1.330671e-03 ~          NA
 

Ответ №2:

Попробуйте :

 library(dplyr)

result <- df %>%
            arrange(Order, `On Time Start`) %>%
            group_by(Order) %>%
            mutate(Span.plus.Queue = as.numeric(difftime(lead(`On Time Start`), 
                             `On Time Start`, units = 'days'))) 
 

Комментарии:

1. выполняется вычисление, но результаты находятся не в правильных ячейках, их необходимо сдвинуть на одну ячейку вверх. Смотрите рисунок.

2. Код запущен, но результаты должны быть сдвинуты на единицу вверх. На картинке вы можете это увидеть. Это единственная часть, которой мне не хватает

3. @JavierPrieto Можете ли вы проверить мой обновленный ответ.