na.locf()
パッケージに似たものを探していますが、以前の非値をzoo
常に使用する代わりに、最も近い非値を使用したいと思います。いくつかのサンプルデータ:NA
NA
dat <- c(1, 3, NA, NA, 5, 7)
(3 は繰り越される)NA
に置き換えます。na.locf
library(zoo)
na.locf(dat)
# 1 3 3 3 5 7
に設定するとna.locf
( 5 は後方に繰り越されます):fromLast
TRUE
na.locf(dat, fromLast = TRUE)
# 1 3 5 5 5 7
しかし、最も近い非NA
値が使用されることを望みます。私の例では、これは 3 を最初のNA
に繰り越し、5 を 2 番目に繰り戻す必要があることを意味しNA
ます。
1 3 3 5 5 7
解決策をコード化しましたが、車輪の再発明ではないことを確認したかったのです。すでに何かが浮かんでいますか?
参考までに、私の現在のコードは次のとおりです。おそらく、他に何もないとしても、誰かがそれをより効率的にする方法を提案できます。これを改善するための明らかな方法が欠けているように感じます:
na.pos <- which(is.na(dat))
if (length(na.pos) == length(dat)) {
return(dat)
}
non.na.pos <- setdiff(seq_along(dat), na.pos)
nearest.non.na.pos <- sapply(na.pos, function(x) {
return(which.min(abs(non.na.pos - x)))
})
dat[na.pos] <- dat[non.na.pos[nearest.non.na.pos]]
以下のsmciの質問に答えるには:
- いいえ、どのエントリも NA にできます
- すべてが NA の場合は、そのままにしておきます
- いいえ。私の現在の解決策はデフォルトで左側の最も近い値ですが、問題ではありません
- 通常、これらの行は数十万の要素であるため、理論的には上限は数十万になります。実際には、あちこちに数個しかなく、通常は 1 つです。
更新したがって、私たちはまったく別の方向に進んでいることがわかりましたが、これは依然として興味深い議論でした。皆さんありがとう!