web-dev-qa-db-ja.com

リスト内のNaN値をゼロ(0)に置き換えます

こんにちは親愛なる私はNaNに問題があります。多くの変数を含む大規模なデータセットを使用していて、NaNがあります。データは次のとおりです。

z=list(a=c(1,2,3,NaN,5,8,0,NaN),b=c(NaN,2,3,NaN,5,8,NaN,NaN))

このコマンドを使用してリストをデータフレームに強制しましたが、次のようになりました。

z=as.data.frame(z)
> is.list(z)
[1] TRUE

> is.data.frame(z)
[1] TRUE
> replace(z,is.nan(z),0) 
Error en is.nan(z) : default method not implemented for type 'list'

Zをデータフレームに強制しましたが、それだけでは不十分でした。リストのNaNを変更するフォームがあるかもしれません。ご協力いただきありがとうございます。このデータはほんの一例であり、私の元のデータには36000の観測値と40の変数があります。

13
Duck

これはrapplyの完璧な使用例です。

> rapply( z, f=function(x) ifelse(is.nan(x),0,x), how="replace" )
$a
[1] 1 2 3 0 5 8 0 0

$b
[1] 0 2 3 0 5 8 0 0

lapplyも機能しますが、この状況ではrapplyはネストされたリストを適切に処理します。

31
Ari B. Friedman

データフレームにデータを置くことを気にしないように、高度にベクトル化された何かを行うこともできます。ただし、これは、各リスト要素の長さが等しい場合にのみ機能します。私はあなたのデータを推測しています(36000/40 = 900)これが当てはまること:

z <- as.data.frame(z)
dim <- dim(z)
y <- unlist(z)
y[ is.nan(y) ] <- 0
x <- matrix( y , dim )
#        [,1] [,2]
#   [1,]    1    0
#   [2,]    2    2
#   [3,]    3    3
#   [4,]    0    0
#   [5,]    5    5
#   [6,]    8    8
#   [7,]    0    0
#   [8,]    0    0
7
Simon O'Hanlon

OPの編集後:編集したタイトルに続いて、これでうまくいくはずです。

_unstack(within(stack(z), values[is.nan(values)] <- 0))
#   a b
# 1 1 0
# 2 2 2
# 3 3 3
# 4 0 0
# 5 5 5
# 6 8 8
# 7 0 0
# 8 0 0
_

結果の出力が同じ長さの場合、unstackは自動的に_data.frame_を提供します(以下に示す最初の例とは異なります)。


古いソリューション(継続性))

これを試して:

_unstack(na.omit(stack(z)))
# $a
# [1] 1 2 3 5 8 0

# $b
# [1] 2 3 5 8
_

注1:投稿から、NaNを0に置き換えたいようです。stack(z)の出力。変数に保存してから0に置き換えてから、unstackを実行できます。 。

注2:また、na.omitはNaNだけでなくNAも削除するため、データにはNAが含まれていないと想定します(上記のデータから)。

3
Arun
z = do.call(data.table, rapply(z, function(x) ifelse(is.nan(x),0,x), how="replace"))

最初にdata.tableがあり、置換を1行にしたい場合。

ただし、その後、キーを再定義する必要があることに注意してください。

> key(x1)
[1] "date"
> x1 = do.call(data.table, rapply(x1, function(x) ifelse(is.na(x), 0, x), how="replace"))
> key(x1)
NULL
1
dmitry