【问题标题】:Split column into segments by groups of start/stop intervals按开始/停止间隔组将列拆分为段
【发布时间】:2019-04-05 17:08:38
【问题描述】:

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

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我们可以fill'group'列将NA元素替换为前面的非NA元素,filter根据'group'值仍然是NA的NA行,按'分组group' slice 直到 'type' 列中的 'stop' 值的行(假设每个 'group' 有一个 '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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2021-11-30
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多