В dplyr это сгруппировано mutate
, отстает FINISH
:
library(dplyr)
df <- data_frame(ROW = 1:6,
ID = c("A", "A", "B", "A", "B", "B"),
ORDER = c(1L, 1L, 1L, 2L, 2L, 2L),
START = c(0L, 2L, 0L, 4L, 2L, 6L),
FINISH = c(1L, 4L, 2L, 5L, 5L, 8L))
df2 <- df %>%
group_by(ID, ORDER) %>%
mutate(NEW = START - lag(FINISH))
df2
#> # A tibble: 6 x 6
#> # Groups: ID, ORDER [4]
#> ROW ID ORDER START FINISH NEW
#> <int> <chr> <int> <int> <int> <int>
#> 1 1 A 1 0 1 NA
#> 2 2 A 1 2 4 1
#> 3 3 B 1 0 2 NA
#> 4 4 A 2 4 5 NA
#> 5 5 B 2 2 5 NA
#> 6 6 B 2 6 8 1
Вы можете сделать то же самое в базе R с подходом разделения-применения-объединения, хотя это выглядит не так хорошо:
df2 <- do.call(rbind,
lapply(split(df, interaction(df$ID, df$ORDER)),
function(x){
x$NEW <- x$START - c(NA, x$FINISH[-nrow(x)]);
x
}))
df2
#> ROW ID ORDER START FINISH NEW
#> A.1.1 1 A 1 0 1 NA
#> A.1.2 2 A 1 2 4 1
#> B.1 3 B 1 0 2 NA
#> A.2 4 A 2 4 5 NA
#> B.2.5 5 B 2 2 5 NA
#> B.2.6 6 B 2 6 8 1
Обратите внимание, что пятый элемент FINISH
изменяется во входных и выходных данных в вопросе, поэтому результат NEW
изменяется в строке 6. Однако логика сохраняется.