Найти временной интервал между группами в data.frame - PullRequest
1 голос
/ 13 апреля 2019

Давайте предположим, что я хочу оценить временную задержку между двумя группами в пределах 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

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

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

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

library(tidyverse)

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

result:

[1] 1 1 2 2 1 5
1 голос
/ 13 апреля 2019

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

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