按开始/停止时间间隔组将列划分为段

时间:2019-04-05 17:08:39

标签: r dplyr tidyr

我有一个非常简单的数据框,其中ID是一个数字序列,并且有多个组,其中开始/结束以开始/结束来表示:

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

如果可以替换组中的缺失值,则可以将数据帧简单地减少为组中非NA的值。我看过tidyr::fill(),但找不到一个好的解决方案。任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

我们可以fill的“组”列中将NA元素替换为前面的非NA元素,filter根据“组”值将NA行中的{仍然不适用,按“组” slice对行进行分组,直到“类型”列中的“停止”值为止(假设每个“组”有一个“开始/停止”组合)

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