17

こんにちは、 に問題があり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 の変数がある例にすぎません。

4

4 に答える 4

34

これは の完璧な使用例です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

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

于 2013-03-23T00:08:43.723 に答える
7

データをデータフレームに入れることを気にしていないように見えるので、高度にベクトル化したこともできます。ただし、これは各リスト要素の長さが等しい場合にのみ機能します。私はあなたのデータ ( 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
于 2013-03-23T00:32:58.813 に答える
3

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

unstackdata.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はNAとNaNを削除するため、データにはNAが含まれていないと仮定します(上記のデータから)。

于 2013-03-23T00:09:35.980 に答える