2017-07-10 176 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