如何在巨大的数据框中用零替换 NaN 值?

Posted

技术标签:

【中文标题】如何在巨大的数据框中用零替换 NaN 值?【英文标题】:How to replace NaN value with zero in a huge data frame? 【发布时间】:2013-08-11 02:46:45 【问题描述】:

我尝试使用以下脚本将 NaN 值替换为零:

rapply( data123, f=function(x) ifelse(is.nan(x),0,x), how="replace" )
# [31]   0.00000000  -0.67994832   0.50287454   0.63979527   1.48410571  -2.90402836

NaN 值显示为零,但当我输入数据框的名称并尝试查看它时,该值仍为 NaN。

data123$contri_us
# [31]          NaN  -0.67994832   0.50287454   0.63979527   1.48410571  -2.90402836

我不确定rapply 命令是否真的在数据框中应用了调整,或者只是按照所示替换了值。

知道如何将NaN 的值实际更改为零吗?

【问题讨论】:

你不能只做data123[is.nan(data123)] <- 0 我试过了,但 R 给出了以下错误消息: > is.nan(data123) 中的错误:没有为类型“list”实现默认方法 【参考方案1】:

is.na 不同,is.nan 似乎实际上没有数据帧的方法。所以,让我们解决这个问题!

is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, is.nan))

data123[is.nan(data123)] <- 0

【讨论】:

你的底部函数应该是“is.nan.data.frame”。 @Dombey 这不是必需的;通过方法分派的魔力,is.nan.data.frame 将被自动调用。【参考方案2】:

其实在R中,这个操作很简单:

如果矩阵 'a' 包含一些 NaN,则只需使用以下代码将其替换为 0:

a <- matrix(c(1, NaN, 2, NaN), ncol=2, nrow=2)
a[is.nan(a)] <- 0
a

如果数据框 'b' 包含一些 NaN,则只需使用以下代码将其替换为 0:

#for a data.frame: 
b <- data.frame(c1=c(1, NaN, 2), c2=c(NaN, 2, 7))
b[is.na(b)] <- 0
b

注意is.nan 是矩阵时与is.na 时是数据框时的区别。

在做

#...
b[is.nan(b)] <- 0
#...

yields: Error in is.nan(b) : default method not implemented for type 'list' 因为 b 是一个数据框。

注意:针对小而混乱的错别字进行了编辑

【讨论】:

这个解释是错误的。 NA 不是 NaN 的数据帧等价物。 错误答案。同意。 此答案适用于仅处理数字和 NaN,或者如果您想将 NA 视为 NaN,因为 is.na(NaN) == TRUE。【参考方案3】:

以下应该做你想要的:

x <- data.frame(X1=sample(c(1:3,NaN), 200, replace=TRUE), X2=sample(c(4:6,NaN), 200, replace=TRUE))
head(x)
x <- replace(x, is.na(x), 0)
head(x)

【讨论】:

【参考方案4】:

这是一个tidyverse 解决方案。我已经用NaNNA 生成了样本数据。第一列已完全完成。

df <- tibble(x = LETTERS[1:5],
             y = c(1:3, NaN, 4),
             z = c(rep(NaN, 3), NA, 5))

> df
# A tibble: 5 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 A         1   NaN
2 B         2   NaN
3 C         3   NaN
4 D       NaN    NA
5 E         4     5

然后我们可以将mutate_allreplace 应用于数据框:

> df %>% 
+   mutate_all(~replace(., is.nan(.), 0))
# A tibble: 5 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 A         1     0
2 B         2     0
3 C         3     0
4 D         0    NA 
5 E         4     5

我们已将 NaN 值替换为零,并且既未触及 NA 值也未触及 x 列。

【讨论】:

以上是关于如何在巨大的数据框中用零替换 NaN 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中用 NaN 替换浮点值?

在熊猫中用 NaN 替换空白值(空格)

在熊猫数据框中用 NaN 替换 None

在Java中用0替换Nan值[重复]

如何使用布尔掩码在 pandas DataFrame 中用 nan 替换“任何字符串”?

如何在熊猫中合并两个数据框以替换 nan