2017-07-10 174 views
2

我有一個data.tabletest均勻分佈差異

test=data.table(x=c(1,2,NA,NA,5)) 
test 
    x 
1: 1 
2: 2 
3: NA 
4: NA 
5: 5 

,我想

test 
    x y 
1: 1 1 
2: 2 1 
3: NA 1 
4: NA 1 
5: 5 NA 

像5-2 = 3,平均分配給3排

diff()功能只適用於

data.table(x,y=c(diff(x),NA)) 
    x y 
1: 1 1 
2: 2 NA 
3: NA NA 
4: NA NA 
5: 5 NA 

回答

1

這裏有一個量化的,但有些過於複雜的解決方案(IMO),似乎所有我測試過

test[, y := { 
    indx <- !is.na(x) 
    indx2 <- .I[indx] 
    c(rep(NA, min(indx2) - 1), 
    rep(diff(x[indx])/diff(indx2), diff(indx2)), 
    rep(NA, .N - max(indx2) + 1)) 
}] 

test 
#  x y 
# 1: 1 1 
# 2: 2 1 
# 3: NA 1 
# 4: NA 1 
# 5: 5 NA 

這是基本的情況下工作,劃分非NA值由它們的位置的不同差異,然後複製它們。如果開始或結束時的值爲NA,它還會從左向右添加NA