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

17

你好,我在使用一个数据集时遇到了NaN的问题。该数据集包含多个变量,其中一些存在NaN值。数据如下:

Hi dear I have a problem with NaN. I am working with a large dataset with many variables and they have NaN. The data is like this:


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个回答

35

这是一个完美使用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 在这种情况下可以正确处理嵌套列表。

lapply 也可以使用,但是在这种情况下,rapply 可以正确处理嵌套列表。


1
@ricardosaporta 我应该加上“罕见的使用情况” :-) - Ari B. Friedman
1
@AriB.Friedman 这对我不起作用,当更改为“is.null”时。 我尝试了a <- list(1,2), length(a) <- 5, rapply(a, f=function(x) ifelse(is.null(x),0,x), how="replace" )并且在3-5处得到了NULL值。 我正在尝试使用零填充a,因为它太短了。 - Stella Biderman

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

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

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除去NA和NaN,我还假设您的数据不包含NA(来自您提供的数据)。


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

如果您最初有data.table并希望一行替换它。但请记住,在此之后需要重新定义键:
> key(x1)
[1] "date"
> x1 = do.call(data.table, rapply(x1, function(x) ifelse(is.na(x), 0, x), how="replace"))
> key(x1)
NULL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接