I tried to replace `NaN`

values with zeros using the following script:

```
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
```

The NaN value was showing to be zero but when I typed in the name of the data frame and tried to review it, the value was still remaining NaN.

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

I am not sure whether the `rapply`

command was actually applying the adjustment in the data frame, or just replaced the value as per shown.

Any idea how to actually change the `NaN`

value to zero?

The following should do what you want:

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

In fact, in R, this operation is very easy:

If the matrix 'a' contains some NaN, you just need to use the following code to replace it by 0:

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

If the data frame 'b' contains some NaN, you just need to use the following code to replace it by 0:

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

Note the difference `is.nan`

when it's a matrix vs. `is.na`

when it's a data frame.

Doing

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

yields: `Error in is.nan(b) : default method not implemented for type 'list'`

because b is a data frame.

Note: Edited for small but confusing typos

It would seem that `is.nan`

doesn't actually have a method for data frames, unlike `is.na`

. So, let's fix that!

```
is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, is.nan))
data123[is.nan(data123)] <- 0
```

Source: Stackoverflow.com