用dplyr填充缺少的序列值

用dplyr填充缺少的序列值,r,dplyr,R,Dplyr,我有一个数据框,缺少“SNAP_ID”的值。我想用基于前一个非缺失值(lag()?)序列的浮点值填充缺失值。如果可能的话,我真的很想使用dplyr来实现这一点 假设: 在第一行或最后一行,我将根据数据集的最小值和最大值之间的缺失天数生成缺失日期,因此永远不会缺少数据 数据集中可能存在多个间隙 当前数据: end SNAP_ID 1 2015-06-26 12:59:00 365 2 2015-06-26 13:59:00 366 3 2015-

我有一个数据框,缺少“SNAP_ID”的值。我想用基于前一个非缺失值(lag()?)序列的浮点值填充缺失值。如果可能的话,我真的很想使用dplyr来实现这一点

假设:

  • 在第一行或最后一行,我将根据数据集的最小值和最大值之间的缺失天数生成缺失日期,因此永远不会缺少数据
  • 数据集中可能存在多个间隙
  • 当前数据:

                      end SNAP_ID
    1 2015-06-26 12:59:00     365
    2 2015-06-26 13:59:00     366
    3 2015-06-27 00:01:00      NA
    4 2015-06-27 23:00:00      NA
    5 2015-06-28 00:01:00      NA
    6 2015-06-28 23:00:00      NA
    7 2015-06-29 09:00:00     367
    8 2015-06-29 09:59:00     368
    
    我想要达到的目标:

                      end SNAP_ID
    1 2015-06-26 12:59:00     365.0
    2 2015-06-26 13:59:00     366.0
    3 2015-06-27 00:01:00     366.1
    4 2015-06-27 23:00:00     366.2
    5 2015-06-28 00:01:00     366.3
    6 2015-06-28 23:00:00     366.4
    7 2015-06-29 09:00:00     367.0
    8 2015-06-29 09:59:00     368.0
    
    作为数据帧:

    df <- structure(list(end = structure(c(1435323540, 1435327140, 1435363260, 
        1435446000, 1435449660, 1435532400, 1435568400, 1435571940), tzone = "UTC", class = c("POSIXct", 
        "POSIXt")), SNAP_ID = c(365, 366, NA, NA, NA, NA, 367, 368)), .Names = c("end", 
        "SNAP_ID"), row.names = c(NA, -8L), class = "data.frame")
    
    @mathematic.coffee的杰出答案如下:

    df %>% 
      arrange(end) %>%
      group_by(tmp=cumsum(!is.na(SNAP_ID))) %>%
      mutate(SNAP_ID=SNAP_ID[1] + 0.1*(0:(length(SNAP_ID)-1))) %>%
      ungroup() %>%
      select(-tmp)
    

    编辑:新版本适用于任意数量的NA运行。 这个也不需要
    zoo

    首先,请注意
    tmp=cumsum(!is.na(SNAP_ID))
    SNAP_ID
    s相同
    tmp
    的此类组由一个非na值和一系列na值组成

    然后按此变量分组,只需在第一个SNAP_ID中添加.1即可填写NAs:

    df %>% 
      arrange(end) %>%
      group_by(tmp=cumsum(!is.na(SNAP_ID))) %>%
      mutate(SNAP_ID=SNAP_ID[1] + 0.1*(0:(length(SNAP_ID)-1)))
    
                      end SNAP_ID tmp
    1 2015-06-26 12:59:00   365.0   1
    2 2015-06-26 13:59:00   366.0   2
    3 2015-06-27 00:01:00   366.1   2
    4 2015-06-27 23:00:00   366.2   2
    5 2015-06-28 00:01:00   366.3   2
    6 2015-06-28 23:00:00   366.4   2
    7 2015-06-29 09:00:00   367.0   3
    8 2015-06-29 09:59:00   368.0   4
    
    然后,您可以在之后删除
    tmp
    列(在末尾添加
    %%>%select(-tmp)


    编辑:这是旧版本,不适用于
    NA
    s的后续运行

    如果您的目标是用以前的值+0.1填充每个NA,则可以使用
    zoo
    NA.locf
    (用以前的值填充每个
    NA
    ),以及
    cumsum(is.NA(SNAP_ID))*0.1来添加额外的0.1

    library(zoo)
    df %>% 
      arrange(end) %>%
      mutate(SNAP_ID=ifelse(is.na(SNAP_ID),
                           na.locf(SNAP_ID) + cumsum(is.na(SNAP_ID))*0.1,
                           SNAP_ID))
    

    谢谢你出色的回答!唯一的小更正是,您需要在select(-tmp)之前解组()。ungroup()有时会让我发疯。
    library(zoo)
    df %>% 
      arrange(end) %>%
      mutate(SNAP_ID=ifelse(is.na(SNAP_ID),
                           na.locf(SNAP_ID) + cumsum(is.na(SNAP_ID))*0.1,
                           SNAP_ID))