将列表中的NaN值替换为零(0)

Duc*_*uck 13 r nan

亲爱的,我有一个问题NaN.我正在处理一个包含许多变量的大型数据集NaN.数据是这样的:

z=list(a=c(1,2,3,NaN,5,8,0,NaN),b=c(NaN,2,3,NaN,5,8,NaN,NaN))
Run Code Online (Sandbox Code Playgroud)

我用这个命令强制列表到数据框但我得到了这个:

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'
Run Code Online (Sandbox Code Playgroud)

我强迫z到数据框但是这还不够,也许NaN在列表中有一个表单需要更改.谢谢你的帮助.这个数据只是我原始数据有36000个观察值和40个变量的例子.

Ari*_*man 31

这是一个完美的用例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
Run Code Online (Sandbox Code Playgroud)

lapply也会工作,但rapply在这种情况下正确处理嵌套列表.


Sim*_*lon 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
Run Code Online (Sandbox Code Playgroud)