Опция 1
Используйте тот факт, что a data.frame
- это список столбцов, а затем используйте do.call
для воссоздания a data.frame
.
do.call(data.frame,lapply(DT, function(x) replace(x, is.infinite(x),NA)))
Вариант 2 - data.table
Вы можете использовать data.table
и set
. Это позволяет избежать внутреннего копирования.
DT <- data.table(dat)
invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA)))
Или используя номера столбцов (возможно, быстрее, если столбцов много):
for (j in 1:ncol(DT)) set(DT, which(is.infinite(DT[[j]])), j, NA)
Сроки
# some `big(ish)` data
dat <- data.frame(a = rep(c(1,Inf), 1e6), b = rep(c(Inf,2), 1e6),
c = rep(c('a','b'),1e6),d = rep(c(1,Inf), 1e6),
e = rep(c(Inf,2), 1e6))
# create data.table
library(data.table)
DT <- data.table(dat)
# replace (@mnel)
system.time(na_dat <- do.call(data.frame,lapply(dat, function(x) replace(x, is.infinite(x),NA))))
## user system elapsed
# 0.52 0.01 0.53
# is.na (@dwin)
system.time(is.na(dat) <- sapply(dat, is.infinite))
# user system elapsed
# 32.96 0.07 33.12
# modified is.na
system.time(is.na(dat) <- do.call(cbind,lapply(dat, is.infinite)))
# user system elapsed
# 1.22 0.38 1.60
# data.table (@mnel)
system.time(invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA))))
# user system elapsed
# 0.29 0.02 0.31
data.table
самый быстрый. Использование sapply
заметно замедляет работу.
Использование
sapply
иis.na<-
Или вы можете использовать (отдавая должное @mnel, чье редактирование это),
что значительно быстрее.
источник
is.na<-
что объект не примет результат от,lapply
но примет результат отsapply
.is.na<-
решение работает намного медленнее.[<-
сmapply
немного быстрее, чемsapply
.С данными MNEL, время
источник
Вот решение dplyr / tidyverse с использованием функции na_if () :
Обратите внимание, что это заменяет только положительную бесконечность на NA. Необходимо повторить, если значения отрицательной бесконечности также необходимо заменить.
источник
В пакете hablar есть очень простое решение этой проблемы:
Которые возвращают фрейм данных со всеми Inf, преобразуются в NA.
Сроки по сравнению с некоторыми вышеупомянутыми решениями. Код: библиотека (хаблар) библиотека (data.table)
Результат:
Похоже, data.table быстрее, чем hablar. Но имеет более длинный синтаксис.
источник
У Фенмая есть ответ на приведенный выше ответ для получения отрицательной и положительной бесконечностей:
Это работает хорошо, но предупреждение - не менять здесь abs (.), Чтобы делать обе строки одновременно, как предлагается в комментариях, получивших одобрение. Это будет выглядеть так, как будто это работает, но все отрицательные значения в наборе данных меняются на положительные! Вы можете подтвердить это:
Для одной строки это работает:
источник
Другое решение:
источник
Вы также можете использовать удобную функцию replace_na: https://tidyr.tidyverse.org/reference/replace_na.html
источник