亲爱的,我有一个问题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
在这种情况下正确处理嵌套列表.
由于您似乎不介意将数据放在数据框中,因此您也可以执行高度矢量化的操作.但是,这仅在每个列表元素具有相同长度时才有效.我猜你的数据(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)