Ответ 1
Казалось бы, is.nan
на самом деле не имеет метода для фреймов данных, в отличие от is.na
. Итак, пусть исправить это!
is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, is.nan))
data123[is.nan(data123)] <- 0
Я попытался заменить значения 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
на ноль?
Казалось бы, is.nan
на самом деле не имеет метода для фреймов данных, в отличие от is.na
. Итак, пусть исправить это!
is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, is.nan))
data123[is.nan(data123)] <- 0
Следующее должно делать то, что вы хотите:
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)
Фактически, в 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 - это кадр данных.
Примечание. Отредактировано для небольших, но запутанных опечаток