我有data.table test
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发布于 2017-07-10 06:07:03
这里有一个矢量化但有点过于复杂的解决方案(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。
https://stackoverflow.com/questions/45003433
复制相似问题