【问题标题】:Adding missing rows to a data frame, filling in data from last known data point将缺失的行添加到数据框中,从最后一个已知数据点填充数据
【发布时间】:2017-12-07 21:21:36
【问题描述】:

我有一个缺少行的数据框。您可以通过查看序列中的间隙来识别缺失的行。

Count<-c(1,1,1,1,2,2,2,3,3,4,4,4,4,5,5,6,6,6)
Seq<-c(1,2,3,4,1,2,4,1,4,1,2,3,5,1,3,1,2,3)
MyData<-c(5,4,5,3,4,3,2,1,2,1,3,2,4,2,3,1,4,3)
DF1<-data.frame(Count,Seq,MyData)
DF1

计数跟踪序列号,并且序列将始终作为数字序列运行。在这种情况下,它是 1:5,但这可能会有所不同,所以我不想硬编码这个限制。

我的目标是创建两个包含所有缺失序列行的新数据框。对于添加的“缺失”行,第一个将在数据列中包含 NA。

Count2<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6)
Seq2<-c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
MyData2<-c(5,4,5,3,NA,4,3,NA,2,NA,1,NA,NA,2,NA,1,3,2,NA,4,2,NA,3,NA,NA,1,4,3,NA,NA)
DF2<-data.frame(Count2,Seq2,MyData2)
DF2

第二个数据帧类似,但包含该序列号的最后一个已知数据点。

Count2<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6)
Seq2<-c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
MyData3<-c(5,4,5,3,NA,4,3,5,2,NA,1,3,5,2,NA,1,3,2,2,4,2,3,3,2,4,1,4,3,2,4)
DF3<-data.frame(Count2,Seq2,MyData3)
DF3

注意 - 对于前 3 个计数,NA 保留在序列中的第 5 个元素,因为没有初始值。

【问题讨论】:

    标签: r na missing-data


    【解决方案1】:

    使用dplyrtidyr 的解决方案。

    library(dplyr)
    library(tidyr)
    
    DF2 <- DF1 %>%
      complete(Count, Seq = full_seq(Seq, period = 1)) %>%
      arrange(Count, Seq)
    
    DF3 <- DF2 %>%
      arrange(Seq, Count) %>%
      group_by(Seq) %>%
      fill(MyData) %>%
      arrange(Count) %>%
      ungroup()
    
    DF2
    # # A tibble: 30 x 3
    #    Count   Seq MyData
    #    <dbl> <dbl>  <dbl>
    #  1     1     1      5
    #  2     1     2      4
    #  3     1     3      5
    #  4     1     4      3
    #  5     1     5     NA
    #  6     2     1      4
    #  7     2     2      3
    #  8     2     3     NA
    #  9     2     4      2
    # 10     2     5     NA
    # # ... with 20 more rows
    
    DF3
    # # A tibble: 30 x 3
    #    Count   Seq MyData
    #    <dbl> <dbl>  <dbl>
    #  1     1     1      5
    #  2     1     2      4
    #  3     1     3      5
    #  4     1     4      3
    #  5     1     5     NA
    #  6     2     1      4
    #  7     2     2      3
    #  8     2     3      5
    #  9     2     4      2
    # 10     2     5     NA
    # # ... with 20 more rows
    

    【讨论】:

      【解决方案2】:

      这是一个使用

      的解决方案
      1. 第一个问题的基础 R 的 merge 在“骨架”dataframe 上,并且
      2. zoo::na.locfNAs 替换为第二个问题的最后一个已知值。

      根据 OP 的要求,从数据中推断出最大的 SeqCount 值。

      # These are the maximum seq and count numbers from the data
      maxSeq <- max(DF1$Seq);
      maxCts <- max(DF1$Count);
      
      # Replicating DF1
      # Construct "skeleton" dataframe with appropriate Seq and Count sequences 
      df.one <- data.frame(
          Count = rep(seq(1:maxCts), each = maxSeq),
          Seq = rep(seq(1:maxSeq), maxCts)
      );
      # Merge with source data, and put NAs for missing entries
      df.one <- merge(df.one, DF1, all = TRUE);
      tail(df.one)
      #   Count Seq MyData
      #25     5   5     NA
      #26     6   1      1
      #27     6   2      4
      #28     6   3      3
      #29     6   4     NA
      #30     6   5     NA
      
      # Replicating DF2
      # Split on Seq, replace NAs in MyData with last known value, 
      # and rbind into dataframe
      df.two <- do.call(rbind.data.frame, lapply(split(df.two, df$Seq), function(x)  {
          x$MyData <- na.locf(x$MyData);
          return(x);
      }))
      # Sort by Count then Seq
      df.two <- df.two[order(df.two$Count, df.two$Seq), ];
      rownames(df.two) <- NULL;
      tail(df.two);
      #   Count Seq MyData
      #25     5   5      3
      #26     6   1      1
      #27     6   2      4
      #28     6   3      3
      #29     6   4      3
      #30     6   5      2
      

      数据

      Count<-c(1,1,1,1,2,2,2,3,3,4,4,4,4,5,5,6,6,6)
      Seq<-c(1,2,3,4,1,2,4,1,4,1,2,3,5,1,3,1,2,3)
      MyData<-c(5,4,5,3,4,3,2,1,2,1,3,2,4,2,3,1,4,3)
      DF1<-data.frame(Count,Seq,MyData)
      

      【讨论】:

        猜你喜欢
        • 2020-11-13
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多