首页 > 解决方案 > 按开始/停止间隔组将列拆分为段

问题描述

我有一个非常简单的数据框,其中 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(),但找不到好的解决方案。任何建议将不胜感激!

标签: rdplyrtidyr

解决方案


我们可以fill将 'group' 列中的NA元素替换为前面的非 NA 元素,filter根据仍然为 NA 的 'group' 值取出 NA 行,按 'group'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 

推荐阅读