【问题标题】:How to replace NaN value with zero in a huge data frame?如何在巨大的数据框中用零替换 NaN 值?
【发布时间】: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”实现默认方法

标签: r replace


【解决方案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 列。

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2021-08-25
      相关资源
      最近更新 更多