Pilihan 1
Gunakan fakta bahwa a data.frame
adalah daftar kolom, lalu gunakan do.call
untuk membuat kembali a data.frame
.
do.call(data.frame,lapply(DT, function(x) replace(x, is.infinite(x),NA)))
Pilihan 2 -- data.table
Anda bisa menggunakan data.table
dan set
. Ini menghindari beberapa penyalinan internal.
DT <- data.table(dat)
invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA)))
Atau menggunakan nomor kolom (mungkin lebih cepat jika ada banyak kolom):
for (j in 1:ncol(DT)) set(DT, which(is.infinite(DT[[j]])), j, NA)
Pengaturan waktu
# 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
adalah yang tercepat. Menggunakan sapply
memperlambat segalanya secara nyata.
Gunakan
sapply
danis.na<-
Atau Anda dapat menggunakan (memberikan kredit kepada @mnel, yang hasil editnya ini),
yang jauh lebih cepat.
sumber
is.na<-
tidak akan menerima hasil darilapply
tetapi akan menerima satu darisapply
.is.na<-
solusinya jauh lebih lambat.[<-
denganmapply
sedikit lebih cepat darisapply
.Dengan data mnel, waktunya adalah
sumber
Berikut adalah solusi dplyr / tidyverse menggunakan fungsi na_if () :
Perhatikan bahwa ini hanya menggantikan tak terhingga positif dengan NA. Perlu diulang jika nilai tak terhingga negatif juga perlu diganti.
sumber
Ada solusi yang sangat sederhana untuk masalah ini di paket hablar:
Yang mengembalikan bingkai data dengan semua Inf diubah menjadi NA.
Pengaturan waktu dibandingkan dengan beberapa solusi di atas. Kode: library (hablar) library (data.table)
Hasil:
Sepertinya data.table lebih cepat dari hablar. Tetapi memiliki sintaks yang lebih panjang.
sumber
Feng Mai memiliki jawaban yang rapi di atas untuk mendapatkan infinitas negatif dan positif:
Ini berfungsi dengan baik, tetapi peringatan untuk tidak menukar in abs (.) Di sini untuk melakukan kedua baris sekaligus seperti yang diusulkan dalam komentar yang diberi suara positif. Ini akan terlihat seperti berfungsi, tetapi mengubah semua nilai negatif dalam kumpulan data menjadi positif! Anda dapat mengonfirmasi dengan ini:
Untuk satu baris, ini berfungsi:
sumber
Solusi lain:
sumber
Anda juga dapat menggunakan fungsi replace_na yang praktis: https://tidyr.tidyverse.org/reference/replace_na.html
sumber