【问题标题】:How can I fill in NA values based on the next real value but divide that value between the preceding NAs?如何根据下一个实际值填写 NA 值,但在前面的 NA 之间划分该值?
【发布时间】:2017-03-31 01:24:26
【问题描述】:

请注意:这是对“数据”来自何处的超简化解释,但数据来自何处与编码问题无关。

我有一个通过每天在管中收集水创建的数据集。 我不能每天都去测量管子(但管子一直在灌水),所以水值记录有差距。 这个虚拟数据集显示了第 5 天和第 10 天发生这种情况的位置,因为这是一个虚拟数据集,我假设每天有 500 毫升水进入试管(真实数据集要混乱得多!)

虚拟数据

day<-c(1,2,3,4,5,6,7,8,9,10,11,12)
value<-c(500,500,500,500,NA,1000,NA,NA,NA,2000,500,500)
df<-data.frame(day,value)

数据说明:我每天1:4收集所以每天的数值是500ml,错过第5天所以数值是NA,第6天收集所以数值是1000ml(第5天的水和第 6 天合并),错过了 7、8、9,因此值等于 NA,在第 10 天收集,4 天的值为 2000ml)然后每天收集最后两天)

我想通过获取下一个“实际”测量值并将该值除以 NA 和该值的日期来填补 NA 空白。是的,我假设如果我没有进行测量,则存在一个恒定的过程,我可以在几天之间平均分配最后一次测量。

这是输出数据的样子

day<-c(1,2,3,4,5,6,7,8,9,10,11,12)
corrected.value<-c(500,500,500,500,500,500,500,500,500,500,500,500)
corrected.df<-data.frame(day,corrected.value)

这只是一个虚拟数据集,否则最简单的方法就是将 NA 替换为 500 为 'value[is.na(value)] &lt;- 500',但在实际数据集中,值可以是 457.6、779、376 等。 也试图做一个循环,但一直卡住...... 关于如何做到这一点的任何想法?

非常感谢您的帮助

【问题讨论】:

    标签: r dataframe data-cleaning


    【解决方案1】:

    这是一个可能的解决方案:

    # Create test Data: 
    # note that this is slightly different from your input
    # but in this way you can better verify that it works as expected
    day<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
    value<-c(NA,500,500,500,NA,3000,NA,NA,NA,5000,500,500,NA,NA,NA)
    df<-data.frame(day,value)
    
    
    # "Cleansing" starts here :
    RLE <- rle(is.na(df$value))
    
    # we cannot do anything if last values are NAs, we'll just keep them in the data.frame
    if(tail(RLE$values,1)){
      RLE$lengths <- head(RLE$lengths,-1)
      RLE$values <- head(RLE$values,-1)
    }
    
    afterNA <- cumsum(RLE$lengths)[RLE$values] + 1
    firstNA <- (cumsum(RLE$lengths)- RLE$lengths + 1)[RLE$values]
    occurences <- afterNA - firstNA + 1
    replacements <- df$value[afterNA] / occurences
    
    df$value[unlist(Map(f=seq.int,firstNA,afterNA))] <- rep.int(replacements,occurences)
    

    结果:

    > df
       day value
    1    1   250
    2    2   250
    3    3   500
    4    4   500
    5    5  1500
    6    6  1500
    7    7  1250
    8    8  1250
    9    9  1250
    10  10  1250
    11  11   500
    12  12   500
    13  13    NA
    14  14    NA
    15  15    NA
    

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2015-01-28
      • 2022-11-30
      相关资源
      最近更新 更多