Рассчитать разницу на основе двух столбцов в R - PullRequest
0 голосов
/ 04 января 2019

У меня есть немного сложный вопрос.Вот мои данные:

> structure(list(seconds = c(689, 689.25, 689.5, 689.75, 690, 690.25, 690.5, 690.75, 691, 691.25, 691.5, 691.75, 692, 692.25, 692.5 ), threat = c(NA, NA, NA, NA, NA, NA, 1L, 1L, 0L, 0L, 1L, NA,  NA, 1L, 1L), bins = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,  3L, 3L, 3L, 3L, 3L)), .Names = c ("seconds", "threat", "bins"), class = "data.frame", row.names = c(NA, -15L))

   seconds threat bins
1   689.00     NA    1
2   689.25     NA    1
3   689.50     NA    1
4   689.75     NA    1
5   690.00     NA    1
6   690.25     NA    2
7   690.50      1    2
8   690.75      1    2
9   691.00      0    2
10  691.25      0    2
11  691.50      1    3
12  691.75     NA    3
13  692.00     NA    3
14  692.25      1    3
15  692.50      1    3

В каждом бине я пытаюсь подсчитать, сколько времени они находятся в каждом типе «угрозы» в столбце угроз.Таким образом, мне нужно будет рассчитывать оценку разницы каждый раз, когда происходит что-то другое в угрозе и в каждом бине.Вот пример того, чего я надеюсь достичь:

  bin threat seconds
   1     NA    1.25
   1      1    0.00
   1      0    0.00
   2     NA    0.25
   2      1    0.50
   2      0    0.50
   3     NA    0.50
   3      1    0.75
   3      0    0.00

1 Ответ

0 голосов
/ 04 января 2019

Вот решение tidyverse:

df %>% arrange(seconds) %>% 
  mutate(duration = lead(seconds) - seconds) %>% 
  complete(bins, threat, fill = list(duration = 0)) %>%
  group_by(bins, threat) %>% 
  summarize(seconds = sum(duration, na.rm = TRUE))
# A tibble: 9 x 3
# Groups:   bins [?]
#    bins threat seconds
#   <int>  <int>   <dbl>
# 1     1      0    0   
# 2     1      1    0   
# 3     1     NA    1.25
# 4     2      0    0.5 
# 5     2      1    0.5 
# 6     2     NA    0.25
# 7     3      0    0   
# 8     3      1    0.5 
# 9     3     NA    0.5 

Вы можете стереть complete(bins, threat, fill = list(duration = 0)), если добавление строк, где seconds равно 0, не нужно.

Итак, сначала мы arrange данные должны быть в безопасности.Затем из-за взаимодействия между threat мы определяем новую переменную duration.Затем мы добавляем новые строки с duration == 0 для тех (bins, threat) случаев, которых еще нет.Наконец, мы группируем по bins и threat и суммируем длительности.

...