[解決済み] NAを最新の非NA値で置き換える
2022-04-21 03:12:29
質問
での
data.frame
(または
data.table
のように、NAを最も近い以前の非NA値で前方に埋めたいのです。簡単な例では、ベクトルを使って、(
data.frame
)は以下の通りです。
> y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
機能を希望する
fill.NAs()
を構築することができます。
yy
というような。
> yy
[1] NA NA NA 2 2 2 2 3 3 3 4 4
この操作を、多数の(合計〜1Tb)小さなサイズの
data.frame
s (~30-50 Mb) で、行はそのすべてのエントリが NA である。この問題にアプローチする良い方法は何ですか?
私が考えた醜い解決策は、この関数を使っています。
last <- function (x){
x[length(x)]
}
fill.NAs <- function(isNA){
if (isNA[1] == 1) {
isNA[1:max({which(isNA==0)[1]-1},1)] <- 0 # first is NAs
# can't be forward filled
}
isNA.neg <- isNA.pos <- isNA.diff <- diff(isNA)
isNA.pos[isNA.diff < 0] <- 0
isNA.neg[isNA.diff > 0] <- 0
which.isNA.neg <- which(as.logical(isNA.neg))
if (length(which.isNA.neg)==0) return(NULL) # generates warnings later, but works
which.isNA.pos <- which(as.logical(isNA.pos))
which.isNA <- which(as.logical(isNA))
if (length(which.isNA.neg)==length(which.isNA.pos)){
replacement <- rep(which.isNA.pos[2:length(which.isNA.neg)],
which.isNA.neg[2:max(length(which.isNA.neg)-1,2)] -
which.isNA.pos[1:max(length(which.isNA.neg)-1,1)])
replacement <- c(replacement, rep(last(which.isNA.pos), last(which.isNA) - last(which.isNA.pos)))
} else {
replacement <- rep(which.isNA.pos[1:length(which.isNA.neg)], which.isNA.neg - which.isNA.pos[1:length(which.isNA.neg)])
replacement <- c(replacement, rep(last(which.isNA.pos), last(which.isNA) - last(which.isNA.pos)))
}
replacement
}
機能
fill.NAs
は以下のように使用します。
y <- c(NA, 2, 2, NA, NA, 3, NA, 4, NA, NA)
isNA <- as.numeric(is.na(y))
replacement <- fill.NAs(isNA)
if (length(replacement)){
which.isNA <- which(as.logical(isNA))
to.replace <- which.isNA[which(isNA==0)[1]:length(which.isNA)]
y[to.replace] <- y[replacement]
}
出力
> y
[1] NA 2 2 2 2 3 3 3 4 4 4
...これは動作するようです。しかし、これは醜いです。何か提案はありますか?
解決方法は?
を使いたいのでしょう。
na.locf()
の関数は
動物園
パッケージから
最後の観測を引き継ぐ
を使用して、NA 値を置き換えます。
ヘルプにある使用例の冒頭部分を紹介します。
library(zoo)
az <- zoo(1:6)
bz <- zoo(c(2,NA,1,4,5,2))
na.locf(bz)
1 2 3 4 5 6
2 2 1 4 5 2
na.locf(bz, fromLast = TRUE)
1 2 3 4 5 6
2 1 1 4 5 2
cz <- zoo(c(NA,9,3,2,3,2))
na.locf(cz)
2 3 4 5 6
9 3 2 3 2
関連
-
R LanguageError in hist.default() : 'x' は数値でなければなりません.
-
R - ユークリッド距離の計算を簡単にする方法
-
[解決済み] パッケージ 'xxx' は利用できません (for R version x.y.z) 」という警告にどのように対処したらよいですか?
-
[解決済み] ベクトル中のxの値を持つ要素の個数を数える
-
[解決済み] なぜ `[`] は `subset` よりも優れているのですか?
-
[解決済み] [Solved] data.frameで全てまたは一部のNA(欠損値)を含む行を削除する。
-
[解決済み】2つのy軸を左右に持ち、異なるスケールを持つggplot
-
[解決済み】ggplot2で軸のタイトルやラベルの大きさを変更する。
-
[解決済み] データフレームのカラムのデータ型を決定する
-
[解決済み] 大規模なdata.tableのNAを置換する最速の方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R: エラー: $ 演算子は原子ベクトルに対して無効です。
-
[解決策】 plot.new() のエラー:図の余白が大きすぎる。
-
DEG解析で'row.names'に重複した名前を付けられない場合の解決法
-
R言語 - マトリックス
-
[解決済み] HTML、PDF、DOCXで見栄えのするシンプルな手動のRMarkdownテーブル
-
[解決済み] Rで複数行のコメントを持つことは可能ですか?[重複している]。
-
[解決済み] ネストされた plot_grid を同じサイズに拡大縮小するには?
-
[解決済み] データフレーム内の列を名前でドロップする方法
-
[解決済み】エラー:Rで関数が見つかりませんでした。
-
[解決済み】set.seed関数を使用する理由