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" ) #  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 #  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.
#... b[is.nan(b)] <- 0 #...
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