web-dev-qa-db-ja.com

巨大なデータフレームでNaN値をゼロに置き換える方法は?

次のスクリプトを使用して、NaN値をゼロに置き換えようとしました。

rapply( data123, f=function(x) ifelse(is.nan(x),0,x), how="replace" )
# [31]   0.00000000  -0.67994832   0.50287454   0.63979527   1.48410571  -2.90402836

NaN値はゼロであることが示されていましたが、データフレームの名前を入力して確認しようとすると、値はまだNaNのままでした。

data123$contri_us
# [31]          NaN  -0.67994832   0.50287454   0.63979527   1.48410571  -2.90402836

rapplyコマンドが実際にデータフレームで調整を適用していたのか、示されているように値を置き換えただけなのかわかりません。

NaN値を実際にゼロに変更する方法はありますか?

31
cactussss

is.nanとは異なり、is.naにはデータフレームのメソッドが実際にはないようです。それで、それを修正しましょう!

is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, is.nan))

data123[is.nan(data123)] <- 0
76
Hong Ooi

実際、Rでは、この操作は非常に簡単です。

マトリックス 'a'にNaNが含まれている場合、次のコードを使用して0に置き換えるだけです。

_a <- matrix(c(1, NaN, 2, NaN), ncol=2, nrow=2)
a[is.nan(a)] <- 0
a
_

データフレーム 'b'にNaNが含まれている場合、次のコードを使用して0に置き換えるだけです。

_#for a data.frame: 
b <- data.frame(c1=c(1, NaN, 2), c2=c(NaN, 2, 7))
b[is.na(b)] <- 0
b
_

マトリックスの場合の_is.nan_とデータフレームの場合の_is.na_の違いに注意してください。

やること

_#...
b[is.nan(b)] <- 0
#...
_

bはデータフレームであるため、Error in is.nan(b) : default method not implemented for type 'list'を生成します。

注:小さいが混乱を招くタイプミスのために編集

27
leDjeg

以下はあなたが望むことをするべきです:

x <- data.frame(X1=sample(c(1:3,NaN), 200, replace=TRUE), X2=sample(c(4:6,NaN), 200, replace=TRUE))
head(x)
x <- replace(x, is.na(x), 0)
head(x)
18
Marc in the box