Разделить столбец на сегменты по группам интервалов запуска / остановки - PullRequest
1 голос
/ 05 апреля 2019

У меня есть очень простой фрейм данных, где ID - это числовая последовательность, и есть несколько групп, где начала / окончания обозначены как start / stop:

ID = c(1:20)
group = c(NA,1,NA,NA,NA,1,NA,NA,NA,2,NA,NA,NA,NA,NA,2,NA,NA,NA,NA) %>% as.factor()
type = c(NA,"start",NA,NA,NA,"stop",NA,NA,NA,"start",NA,NA,NA,NA,NA,"stop",NA,NA,NA,NA) %>% as.factor()

df = data.frame(ID,group,type)
head(df)

   ID group  type
1   1  <NA>  <NA>
2   2     1 start
3   3  <NA>  <NA>
4   4  <NA>  <NA>
5   5  <NA>  <NA>
6   6     1  stop

Я хотел бы заполнить NA всгруппируйте смежные значения и разделите фрейм данных на сегменты между интервалами начала / остановки:

   ID group  type
1   2     1 start
2   3     1  <NA>
3   4     1  <NA>
4   5     1  <NA>
5   6     1  stop
6  10     2 start
7  11     2  <NA>
8  12     2  <NA>
9  13     2  <NA>
10 14     2  <NA>
11 15     2  <NA>
12 16     2  stop

Если пропущенные значения в группе можно заменить, то фрейм данных можно просто уменьшить до значений в группеэто не АН.Я посмотрел на tidyr::fill(), но не могу найти хорошее решение.Любые предложения будут высоко оценены!

1 Ответ

2 голосов
/ 05 апреля 2019

Мы можем fill столбец 'group', чтобы заменить элементы NA предшествующими элементами, отличными от NA, filter из строк NA, основанных на значениях 'group', которые все еще являются NA, сгруппированными по ' группа 'slice строк до значения' stop 'в столбце' type '(при условии, что для каждой группы используется комбинация' start / stop ')

library(tidyverse)
df %>% 
  fill(group) %>% 
  filter(!is.na(group)) %>% 
  group_by(group) %>% 
  slice(seq_len(which(type == "stop"))) 
# A tibble: 12 x 3
# Groups:   group [2]
#      ID group type 
#   <int> <fct> <fct>
# 1     2 1     start
# 2     3 1     <NA> 
# 3     4 1     <NA> 
# 4     5 1     <NA> 
# 5     6 1     stop 
# 6    10 2     start
# 7    11 2     <NA> 
# 8    12 2     <NA> 
# 9    13 2     <NA> 
#10    14 2     <NA> 
#11    15 2     <NA> 
#12    16 2     stop 
...