Как заменить значение NaN на ноль в огромном фрейме данных?

Я попытался заменить значения NaN на нули, используя следующий 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

Значение NaN показывалось равным нулю, но когда я ввел имя фрейма данных и попытался его просмотреть, значение оставалось еще NaN.

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

Я не уверен, действительно ли команда rapply применяла настройку в фрейме данных или просто заменила значение в соответствии с показанным.

Любая идея, как реально изменить значение NaN на ноль?

Ответы

Ответ 1

Казалось бы, is.nan на самом деле не имеет метода для фреймов данных, в отличие от is.na. Итак, пусть исправить это!

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

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

Ответ 2

Следующее должно делать то, что вы хотите:

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)

Ответ 3

Фактически, в 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
#...

дает: Error in is.nan(b) : default method not implemented for type 'list', потому что b - это кадр данных.

Примечание. Отредактировано для небольших, но запутанных опечаток