簡體   English   中英

如何根據下一個實際值填寫NA值,但在前面的NA之間划分該值?

[英]How can I fill in NA values based on the next real value but divide that value between the preceding NAs?

請注意:這是對“數據”來自何處的超簡化說明,但數據來自哪里與編碼問題無關。

我每天通過在管中收集水來創建數據集。 我不能每天測量管子(但管子不斷填充),所以水值記錄中有空隙。 這個虛擬數據集顯示了第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)

再次,這只是一個虛擬數據集,否則最簡單的方法就是用' value[is.na(value)] <- 500 '替換NA為500,但在實際數據集中,值可以是457.6,779,376還試圖做一個循環,但一直卡住......有關如何做到這一點的任何想法?

非常感謝幫助

這是一個可能的解決方案:

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM