2017-07-19 46 views
1

我有一些數據集丟失了數據集,現在我需要用sample()函數來僞裝10次來替換NA,但是對sample()函數有更多的要求。使用樣本函數sample()用一些條件替換R中的NA

ID <- c(rep(1,4), rep(3, 5), rep(4,4),rep(5,5),rep(6,5)) 
Begin <- c(0,2.5,3.5,3,7,8,7,25,25,10,15,0,0,1,NA,10,11,13,NA,NA, 8, 12, NA) 
End <- c(1.5,3.5,NA,6,12,8,11,29,35, 12,19,NA,28,5,20,30,20,25,6,7,13,NA, 23) 
GA <- c(23, 34, 38, 16, 20, 38, 32, 28, 30, 34,25,45,34,23, 34, 38, 16, 20, 38, 32, 28, 30, 34) 
df <- data.table(ID, Begin, End, GA) 
    ID Begin End GA 
1: 1 0.0 1.5 23 
2: 1 2.5 3.5 34 
3: 1 3.5 NA 38 
4: 1 3.0 6.0 16 
5: 3 7.0 12.0 20 
6: 3 8.0 8.0 38 
7: 3 7.0 11.0 32 
8: 3 25.0 29.0 28 
9: 3 25.0 35.0 30 
10: 4 10.0 12.0 34 
11: 4 15.0 19.0 25 
12: 4 0.0 NA 45 
13: 4 0.0 28.0 34 
14: 5 1.0 5.0 23 
15: 5 NA 20.0 34 
16: 5 10.0 30.0 38 
17: 5 11.0 20.0 16 
18: 5 13.0 25.0 20 
19: 6 NA 6.0 38 
20: 6 NA 7.0 32 
21: 6 8.0 13.0 28 
22: 6 12.0 NA 30 
23: 6 NA 23.0 34 
  1. 組由ID
  2. 如果我們品嚐完變量,NA的範圍,需要比下一行比GA比開始更小,更大的,比以前的更大一行和更小的。
  3. 如果我們採樣開始可變,NA的範圍,需要比結束的前一行較小然後結束可變的,但更大的

實施例:

第3行,完變量爲NA,使得當我們採樣,即NA需要是在範圍[3,5,6-]

第12行,結束變量爲NA,即NA必須在範圍[19,28]

列15,開始是NA,所以NA> = 5 & NA < = 20,NA < = 34,所以範圍[5,20]

行19,開始是NA,[0,6]

列20,開始是NA,NA> = 6,NA < = 7,所以範圍[6,7]

行22,結束爲NA,NA [13,23]

行23的範圍內,開始是NA,NA> =值我們只是樣品列22, NA < = 23

+0

那麼,你到目前爲止嘗試過什麼? –

+0

我同情那些用英語來做這件事的人,這不是他們的自然語言,但請仔細檢查你的問題,看看你能否糾正語法錯誤。我不完全理解爲你做這件事。 –

+0

我差不多完成了,我將在後面重寫 – BIN

回答

2

我不確定這是否涵蓋所有特殊情況(例如如果有很多NA),但對於給定的樣本,它應該工作。

也可能有更好的解決方案,不包括創建變量_pre_next

我用一個for-loop來創建值rowise(由INDEX)。而不是sample()我用runif(),因爲我認爲你不想只得到整數。

df[, INDEX := 1:.N] 
df[, End_next := shift(End, type = "lead")] 
df[, End_pre := shift(End, type = "lag")] 
df[, ID_pre := shift(ID, type = "lag")] 
df[, ID_next := shift(ID, type = "lead")] 

for (i.row in c(1:dim(df)[1])) { 
    # i.row = 3 
    # adjust the values after last sample 
    df[, Begin_pre := shift(Begin, type = "lag")] 
    df[, End_pre := shift(End, type = "lag")] 

    # replace NA with sample (runif) 
    df[is.na(Begin) & INDEX == i.row, 
    Begin := runif(1, min = ifelse(ID_pre == ID, End_pre,0), max = End)] 
    df[is.na(End) & INDEX == i.row, 
    End := runif(1, min = max(Begin, ifelse(ID_pre == ID, End_pre, Begin)), 
        max = min(GA, ifelse(ID_next == ID, End_next, GA)))] 
} 

我希望這會幫助你。

+0

謝謝,在看了所有特例之後,我想我應該首先對End進行採樣,然後對Begin進行採樣,這樣做更有意義,試圖同時對兩者進行採樣 – BIN