Cleaning `Inf` values from an R dataframe
In R, I have an operation which creates some Inf values when I transform a data frame.
I would like to turn these Inf values into NA values. The code I have is slow for large data, is there a faster way of doing this?
Say I have the following data frame:
dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b"))
The following works in a single case:
dat[,1][is.infinite(dat[,1])] = NA
So I generalized it with the following loop
cf_DFinf2NA <- function(x)
{
for (i in 1:ncol(x)){
x[,i][is.infinite(x[,i])] = NA
}
return(x)
}
But I don't think that this is really using the power of R.
To clean 'Inf' values from a data frame, you can use the following functions:
Using do.call and replace on the data frame:
You can also use the set function from the data. table package which uses references instead of internal copying.
Or
To remove inf in r, you can also use the following functions:
Using do.call and replace on the data frame:
dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b"))
> dat
a b d
1 1 Inf a
2 Inf 3 b
> do.call(data.frame,lapply(dat, function(x) replace(x, is.infinite(x),NA)))
a b d
1 1 NA a
2 NA 3 b
You can also use the set function from the data.table package which uses references instead of internal copying.
for (j in 1:ncol(dat)) set(dat, which(is.infinite(dat[[j]])), j, NA)
> dat
a b d
1 1 NA a2 NA 3 b