na.approx()
を使用した補間によってデータフレームからNA
sを削除しようとしていますが、すべてのNA
sを削除できません。
私のデータフレームは4096x4096で、無効な値のフラグとして270.15があります。気象モデルを提供するには、すべての点でデータが連続している必要があります。昨日、別のデータフレームに基づいてデータフレームの値を置き換える方法について質問し、回答を得ました。しかしその後、私はna.approx()
に行き、270.15の値をNA
に置き換え、na.approx()
を試してデータを補間することにしました。しかし、問題は、なぜna.approx()
がすべてのNAを置き換えるわけではないのかということです。
これは私がしていることです:
フラグ値をNAに置き換えます
> sst4[sst4 == 270.15 ] = NA
最初の列(またはその他)を確認してください
> summary(sst4[,1])
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
271.3 276.4 285.9 285.5 292.3 302.8 1345.0
Na.approxを実行します
> sst4=na.approx(sst4,na.rm="FALSE")
最初の列を確認してください
> summary(sst4[,1])
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
271.3 276.5 286.3 285.9 292.6 302.8 411.0
ご覧のとおり、411NAは削除されていません。どうして?それらはすべて先頭/終了列の値に対応していますか?
head(sst4[,1])
[1] NA NA NA NA NA NA
tail(sst4[,1])
[1] NA NA NA NA NA NA
Na.approxは、補間するためにNAの前後に有効な値を持つ必要がありますか?他のna.approxオプションを設定する必要がありますか?
どうもありがとうございました
小さくて再現可能な例:
library(Zoo)
set.seed(1)
m <- matrix(runif(16, 0, 100), nrow = 4)
missing_values <- sample(16, 7)
m[missing_values] <- NA
m
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 NA 6.178627 38.41037
[3,] NA NA NA NA
[4,] 90.82078 66.07978 NA NA
na.approx(m)
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206 6.178627 38.41037
[3,] 64.01658 50.77592 NA NA
[4,] 90.82078 66.07978 NA NA
m[4, 4] <- 50
na.approx(m)
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206 6.178627 38.41037
[3,] 64.01658 50.77592 NA 44.20519
[4,] 90.82078 66.07978 NA 50.00000
はい、列の開始値と終了値を知る必要があるようです。そうしないと、補間が機能しません。境界の値を推測できますか?
別の編集:したがって、デフォルトでは、列の開始値と終了値を知る必要があります。ただし、na.approx
を渡すことで、常に空白を埋めるようにrule = 2
を取得することは可能です。フェリックスの答えを参照してください。 Gaborのコメントに従って、na.fill
を使用してデフォルト値を指定することもできます。最後に、境界条件を2方向に補間するか(以下を参照)、境界条件を推測することができます。
編集:さらなる考え。 na.approx
は列でのみ補間され、データは空間的であるため、行での補間も役立つ可能性があります。次に、平均を取ることができます。
列全体がNA
の場合、na.approx
は失敗するため、より大きなデータセットを作成します。
set.seed(1)
m <- matrix(runif(64, 0, 100), nrow = 8)
missing_values <- sample(64, 15)
m[missing_values] <- NA
na.approx
を双方向で実行します。
by_col <- na.approx(m)
by_row <- t(na.approx(t(m)))
最良の推測を見つけてください。
default <- 50
best_guess <- ifelse(is.na(by_row),
ifelse(
is.na(by_col),
default, #neither known
by_col #only by_col known
),
ifelse(
is.na(by_col),
by_row, #only by_row known
(by_row + by_col) / 2 #both known
)
)
na.approx()
は、デフォルトでは、値を補間するのではなく、値を補間するだけでapprox()
関数の後に続きます。ただし、approx()
のヘルプページで説明されているように、rule = 2
を指定して、最も近い極値の定数値として外挿することができます。リッチーコットンの例に続いて:
na.approx(m, rule = 2)
[,1] [,2] [,3] [,4]
[1,] 26.55087 20.16819 62.911404 68.70228
[2,] 37.21239 35.47206 6.178627 38.41037
[3,] 64.01658 50.77592 6.178627 38.41037
[4,] 90.82078 66.07978 6.178627 38.41037
同様に、「最後の観測の繰り越し」を明示的に使用できます。
na.locf(na.approx(m))
## "first observation carry backwards" too:
na.locf(na.locf(na.approx(m)), fromLast = TRUE)
na.rm=TRUE
を設定してみるべきだと思います
ドキュメントから
na.rm論理。主要なNAを削除する必要がありますか?