如何在一个庞大的 Dataframe 中将NaN值替换为零?

vpfxa7rd  于 2022-12-25  发布在  其他
关注(0)|答案(4)|浏览(641)

我尝试使用以下脚本将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的值更改为零吗?

qc6wkl3g

qc6wkl3g1#

看起来is.nan不像is.na,它实际上没有 Dataframe 的方法。

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

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

vwkv1x7d2#

实际上,在R中,这个操作非常简单:
如果矩阵'a'包含一些NaN,您只需要使用以下代码将其替换为0:

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

如果 Dataframe '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( Dataframe )的差异。

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

产生:Error in is.nan(b) : default method not implemented for type 'list',因为b是 Dataframe 。
注:针对小而混乱的错别字进行了编辑

ghg1uchk

ghg1uchk3#

下面的代码可以满足您的需要:

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)
wj8zmpe1

wj8zmpe14#

下面是一个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一起应用于 Dataframe :

> 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列。

更新为dplyr 1.0.0

由于mutate_all已弃用,我们现在可以使用across()重写表达式,如下所示:

> df %>% 
+   mutate(across(everything(), ~replace(.x, is.nan(.x), 0)))
# A tibble: 5 × 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

相关问题