こんにちは親愛なる私は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の変数があります。
これは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
はネストされたリストを適切に処理します。
データフレームにデータを置くことを気にしないように、高度にベクトル化された何かを行うこともできます。ただし、これは、各リスト要素の長さが等しい場合にのみ機能します。私はあなたのデータを推測しています(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
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が含まれていないと想定します(上記のデータから)。
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