Найти временную задержку между группами в data.frame

#r #dataframe #time #grouping #lag

#r #фрейм данных #время #группировка #задержка

Вопрос:

Предположим, я хочу оценить временную задержку между двумя группами внутри a data.frame .

Вот пример моих данных:

 df_1 = data.frame(time = c(1,3,5,6,8,11,15,16,18,20), group = 'a') # create group 'a' data
df_2 = data.frame(time = c(2,7,10,13,19,25), group = 'b') # create group 'b' data

df = rbind(df_1, df_2) # merge groups

df = df[with(df, order(time)), ] # order by time
rownames(df) = NULL #remove row names

> df
   time group
1     1     a
2     2     b
3     3     a
4     5     a
5     6     a
6     7     b
7     8     a
8    10     b
9    11     a
10   13     b
11   15     a
12   16     a
13   18     a
14   19     b
15   20     a
16   25     b
  

Теперь мне нужно вычесть time наблюдение из группы b в time наблюдение из группы a .
т.Е. 2-1, 7-6, 10-8, 13-11, 19-18 и 25-20.

 # Expected output
> out
[1] 1 1 2 2 1 5
  

Как я могу этого добиться?

Ответ №1:

Мы можем найти индексы b и вычесть time значение из предыдущего индекса.

 inds <- which(df$group == "b")
df$time[inds] - df$time[inds - 1]
#[1] 1 1 2 2 1 5
  

Ответ №2:

Вот tidyverse решение. Сначала добавьте столбец по базовой логике появления группы b с transmute и вычитанием предыдущего столбца. Затем filter просто к результатам и преобразовать в вектор с помощью deframe

 library(tidyverse)

df %>%
  transmute(result = if_else(group == "b", time - lag(time), 0)) %>% 
  filter(result != 0) %>%
  deframe()
  

Результат:

 [1] 1 1 2 2 1 5