Saya memiliki kerangka data dengan beberapa kolom numerik. Beberapa baris memiliki nilai 0 yang harus dianggap nol dalam analisis statistik. Apa cara tercepat untuk mengganti semua nilai 0 ke NULL dalam R?
Saya tidak berpikir Anda ingin / bisa mengganti dengan nilai NULL, tetapi NA melayani tujuan itu dalam bahasa R.
Mengejar
Jawaban:
243
Mengganti semua nol ke NA:
df[df ==0]<-NA
Penjelasan
1. Bukan NULLapa yang Anda ingin ganti dengan nol. Seperti yang tertulis di ?'NULL',
NULL mewakili objek nol di R
yang unik dan, saya kira, dapat dilihat sebagai objek yang paling tidak informatif dan kosong. 1 Maka tidak begitu mengejutkan
data.frame(x = c(1,NULL,2))# x# 1 1# 2 2
Artinya, R tidak menyediakan ruang untuk objek nol ini. 2 Sementara itu, melihat ?'NA'kita melihat itu
NA adalah konstanta logis dengan panjang 1 yang berisi indikator nilai yang hilang. NA dapat dipaksakan untuk jenis vektor lainnya kecuali mentah.
Yang penting, NAadalah panjang 1 sehingga R menyediakan ruang untuk itu. Misalnya,
data.frame(x = c(1,NA,2))# x# 1 1# 2 NA# 3 2
Selain itu, struktur bingkai data mengharuskan semua kolom memiliki jumlah elemen yang sama sehingga tidak ada "lubang" (yaitu, NULLnilai).
Sekarang Anda bisa mengganti nol dengan NULLdalam bingkai data dalam arti sepenuhnya menghapus semua baris yang mengandung setidaknya satu nol. Bila menggunakan, misalnya, var, cov, atau cor, yang benar-benar setara dengan pertama menggantikan nol dengan NAdan menetapkan nilai usesebagai "complete.obs". Namun, biasanya, ini tidak memuaskan karena menyebabkan hilangnya informasi tambahan.
2. Alih-alih menjalankan semacam loop, dalam solusi saya menggunakan df == 0vektorisasi. df == 0mengembalikan (coba) matriks dengan ukuran yang sama dengan df, dengan entri TRUEdan FALSE. Lebih lanjut, kami juga diizinkan untuk meneruskan matriks ini ke subset [...](lihat ?'['). Terakhir, sementara hasil dari df[df == 0]intuisi sempurna, mungkin tampak aneh yang df[df == 0] <- NAmemberikan efek yang diinginkan. Operator penugasan <-memang tidak selalu begitu pintar dan tidak bekerja dengan cara ini dengan beberapa objek lain, tetapi ia melakukannya dengan bingkai data; lihat ?'<-'.
1 Himpunan kosong dalam teori himpunan terasa entah bagaimana terkait. 2 Kesamaan lain dengan teori himpunan: himpunan kosong adalah himpunan bagian dari setiap himpunan, tetapi kami tidak menyediakan ruang untuk itu.
Apa yang akan menjadi sintaks yang setara untuk objek data.table?
itpetersen
6
Saya melihat Anda mendapatkan banyak suara tetapi tidak berpikir ini dengan tepat mencakup kasus tepi kolom non-numerik dengan nilai "0" yang tidak diminta untuk disetel ke <NA>.
IRTFM
33
Biarkan saya berasumsi bahwa data.frame Anda adalah campuran dari tipe data yang berbeda dan tidak semua kolom perlu dimodifikasi.
untuk memodifikasi hanya kolom 12 hingga 18 (dari total 21), lakukan saja ini
#Sample data
set.seed(1)
dat <- data.frame(x = sample(0:2,5,TRUE), y = sample(0:2,5,TRUE))#-----
x y
102212311421500#replace zeros with NA
dat[dat==0]<-NA#-----
x y
1NA22123114215NANA
Karena seseorang meminta versi Data.Table ini, dan karena solusi data.frame yang diberikan tidak bekerja dengan data.table, saya memberikan solusi di bawah ini.
Pada dasarnya, gunakan :=operator ->DT[x == 0, x := NA]
library("data.table")
status = as.data.table(occupationalStatus)
head(status,10)
origin destination N
1:11502:21163:31124:41115:5126:61127:7108:8109:121910:2240
status[N ==0, N :=NA]
head(status,10)
origin destination N
1:11502:21163:31124:41115:5126:61127:71NA8:81NA9:121910:2240
Saya tidak yakin ini solusi yang tepat. Bagaimana dengan kolom 6 dan lebih banyak. Mereka akan dipotong.
userJT
Itu sebabnya saya menyarankan untuk mengganti 1:5dengan 1:ncol(df)di akhir. Saya tidak ingin membuat persamaan terlalu rumit atau sulit dibaca.
Alium Britt
tetapi bagaimana jika di kolom 6 dan 7 - tipe data adalah char dan tidak ada penggantian yang harus dilakukan. Dalam masalah saya, saya perlu penggantian hanya di kolom 12 hingga 15 tetapi seluruh df memiliki 21 kolom (banyak yang tidak boleh disentuh sama sekali).
userJT
Untuk frame data Anda Anda hanya bisa mengubah 1:5ke nomor kolom yang ingin diubah, seperti 12:15, tetapi jika Anda ingin mengkonfirmasi bahwa hal itu hanya akan mempengaruhi kolom numerik kemudian hanya membungkus baris kedua fungsi dalam sebuah pernyataan jika, seperti ini: if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }.
Alium Britt
0
Jika ada yang datang ke sini melalui google untuk mencari yang sebaliknya (yaitu cara mengganti semua NAS dalam data.frame dengan 0), jawabannya adalah
Jawaban:
Mengganti semua nol ke NA:
Penjelasan
1. Bukan
NULL
apa yang Anda ingin ganti dengan nol. Seperti yang tertulis di?'NULL'
,yang unik dan, saya kira, dapat dilihat sebagai objek yang paling tidak informatif dan kosong. 1 Maka tidak begitu mengejutkan
Artinya, R tidak menyediakan ruang untuk objek nol ini. 2 Sementara itu, melihat
?'NA'
kita melihat ituYang penting,
NA
adalah panjang 1 sehingga R menyediakan ruang untuk itu. Misalnya,Selain itu, struktur bingkai data mengharuskan semua kolom memiliki jumlah elemen yang sama sehingga tidak ada "lubang" (yaitu,
NULL
nilai).Sekarang Anda bisa mengganti nol dengan
NULL
dalam bingkai data dalam arti sepenuhnya menghapus semua baris yang mengandung setidaknya satu nol. Bila menggunakan, misalnya,var
,cov
, ataucor
, yang benar-benar setara dengan pertama menggantikan nol denganNA
dan menetapkan nilaiuse
sebagai"complete.obs"
. Namun, biasanya, ini tidak memuaskan karena menyebabkan hilangnya informasi tambahan.2. Alih-alih menjalankan semacam loop, dalam solusi saya menggunakan
df == 0
vektorisasi.df == 0
mengembalikan (coba) matriks dengan ukuran yang sama dengandf
, dengan entriTRUE
danFALSE
. Lebih lanjut, kami juga diizinkan untuk meneruskan matriks ini ke subset[...]
(lihat?'['
). Terakhir, sementara hasil daridf[df == 0]
intuisi sempurna, mungkin tampak aneh yangdf[df == 0] <- NA
memberikan efek yang diinginkan. Operator penugasan<-
memang tidak selalu begitu pintar dan tidak bekerja dengan cara ini dengan beberapa objek lain, tetapi ia melakukannya dengan bingkai data; lihat?'<-'
.1 Himpunan kosong dalam teori himpunan terasa entah bagaimana terkait.
2 Kesamaan lain dengan teori himpunan: himpunan kosong adalah himpunan bagian dari setiap himpunan, tetapi kami tidak menyediakan ruang untuk itu.
sumber
Biarkan saya berasumsi bahwa data.frame Anda adalah campuran dari tipe data yang berbeda dan tidak semua kolom perlu dimodifikasi.
untuk memodifikasi hanya kolom 12 hingga 18 (dari total 21), lakukan saja ini
sumber
Cara alternatif tanpa
[<-
fungsi:Kerangka data sampel
dat
(disalin tanpa malu-malu dari jawaban @ Chase):Nol bisa diganti dengan
NA
denganis.na<-
fungsi:sumber
dplyr::na_if()
adalah sebuah opsi:sumber
sumber
Karena seseorang meminta versi Data.Table ini, dan karena solusi data.frame yang diberikan tidak bekerja dengan data.table, saya memberikan solusi di bawah ini.
Pada dasarnya, gunakan
:=
operator ->DT[x == 0, x := NA]
sumber
for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)
. Lihat di sini untuk diskusi lebih rinci tentang penggunaan data.Anda dapat mengganti
0
denganNA
hanya dalam bidang numerik (yaitu mengecualikan hal-hal seperti faktor), tetapi berfungsi berdasarkan kolom-demi-kolom:Dengan suatu fungsi, Anda dapat menerapkan ini ke seluruh kerangka data Anda:
Meskipun Anda bisa mengganti
1:5
dengan jumlah kolom di bingkai data Anda, atau dengan1:ncol(df)
.sumber
1:5
dengan1:ncol(df)
di akhir. Saya tidak ingin membuat persamaan terlalu rumit atau sulit dibaca.1:5
ke nomor kolom yang ingin diubah, seperti12:15
, tetapi jika Anda ingin mengkonfirmasi bahwa hal itu hanya akan mempengaruhi kolom numerik kemudian hanya membungkus baris kedua fungsi dalam sebuah pernyataan jika, seperti ini:if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
.Jika ada yang datang ke sini melalui google untuk mencari yang sebaliknya (yaitu cara mengganti semua NAS dalam data.frame dengan 0), jawabannya adalah
ATAU
Menggunakan dplyr / tidyverse
sumber