Bagaimana Anda mengonversi kolom bingkai data ke tipe numerik?
sumber
Bagaimana Anda mengonversi kolom bingkai data ke tipe numerik?
Karena (masih) tidak ada yang mendapat tanda centang, saya berasumsi bahwa Anda memiliki beberapa masalah praktis dalam pikiran, terutama karena Anda belum menentukan jenis vektor apa yang ingin Anda konversi numeric
. Saya sarankan Anda harus menerapkan transform
fungsi untuk menyelesaikan tugas Anda.
Sekarang saya akan menunjukkan "anomali konversi" tertentu:
# create dummy data.frame
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
Mari kita melirik data.frame
> d
char fake_char fac char_fac num
1 a 1 1 a 1
2 b 2 2 b 2
3 c 3 3 c 3
4 d 4 4 d 4
5 e 5 5 e 5
dan mari kita jalankan:
> sapply(d, mode)
char fake_char fac char_fac num
"character" "character" "numeric" "numeric" "numeric"
> sapply(d, class)
char fake_char fac char_fac num
"character" "character" "factor" "factor" "integer"
Sekarang Anda mungkin bertanya pada diri sendiri, "Di mana anomali itu?" Yah, saya telah bertemu dengan hal-hal yang sangat aneh di R, dan ini bukan hal yang paling membingungkan, tetapi itu dapat membingungkan Anda, terutama jika Anda membaca ini sebelum berguling ke tempat tidur.
Ini dia: dua kolom pertama adalah character
. Saya sengaja menelepon nomor dua fake_char
. Temukan kesamaan character
variabel ini dengan variabel yang dibuat Dirk dalam jawabannya. Ini sebenarnya sebuah numerical
vektor yang dikonversi menjadi character
. 3 rd dan 4 th kolom yang factor
, dan yang terakhir adalah "murni" numeric
.
Jika Anda menggunakan transform
fungsi, Anda bisa mengubahnya fake_char
menjadi numeric
, tetapi bukan char
variabel itu sendiri.
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
tetapi jika Anda melakukan hal yang sama fake_char
dan char_fac
, Anda akan beruntung, dan lolos tanpa NA:
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
Jika Anda menyimpan transformasi data.frame
dan memeriksa mode
dan class
, Anda akan mendapatkan:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
Jadi, kesimpulannya adalah: Ya, Anda dapat mengubah character
vektor menjadi numeric
satu, tetapi hanya jika elemen-elemennya "dapat dikonversi" numeric
. Jika hanya ada satu character
elemen dalam vektor, Anda akan mendapatkan kesalahan ketika mencoba mengubah vektor itu menjadi numerical
satu.
Dan hanya untuk membuktikan maksud saya:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
Dan sekarang, hanya untuk bersenang-senang (atau berlatih), coba tebak output dari perintah ini:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
Salam untuk Patrick Burns! =)
Sesuatu yang telah membantu saya: jika Anda memiliki rentang variabel untuk dikonversi (atau lebih dari satu), Anda dapat menggunakannya
sapply
.Agak tidak masuk akal tetapi hanya sebagai contoh:
Katakanlah kolom 3, 6-15 dan 37 dari Anda dataframe perlu dikonversi menjadi numerik yang bisa:
sumber
sapply
panggilan dias.data.frame()
sisi kanan, seperti yang disarankan @Mehrad Mahmoudian di bawah ini, itu akan berfungsi.jika
x
adalah nama kolom dari dataframedat
, danx
merupakan tipe faktor, gunakan:sumber
as.character
memang apa yang saya cari. Kalau tidak, konversi terkadang salah. Setidaknya dalam kasus saya.Error: (list) object cannot be coerced to type 'double'
meskipun saya cukup yakin bahwa vektor saya tidak memiliki karakter / tanda baca. Kemudian saya mencobaas.numeric(as.character(dat$x))
dan berhasil. Sekarang saya tidak yakin apakah kolom saya sebenarnya hanya bilangan bulat atau tidak!Saya akan menambahkan komentar (tidak boleh peringkat rendah)
Hanya untuk menambahkan pada user276042 dan pangratz
Ini akan menimpa nilai kolom yang ada x
sumber
Meskipun pertanyaan Anda benar-benar numerik, ada banyak konversi yang sulit dipahami ketika memulai R. Saya akan berupaya membahas metode untuk membantu. Pertanyaan ini mirip dengan Pertanyaan Ini .
Konversi jenis dapat menjadi masalah di R karena (1) faktor tidak dapat dikonversi langsung ke numerik, mereka perlu dikonversi ke kelas karakter terlebih dahulu, (2) tanggal adalah kasus khusus yang biasanya perlu Anda tangani secara terpisah, dan (3) perulangan di kolom bingkai data bisa rumit. Untungnya, "tidyverse" telah menyelesaikan sebagian besar masalah.
Solusi ini digunakan
mutate_each()
untuk menerapkan fungsi ke semua kolom dalam bingkai data. Dalam hal ini, kami ingin menerapkantype.convert()
fungsi, yang mengubah string menjadi numerik di mana ia bisa. Karena R menyukai faktor (tidak yakin mengapa) kolom karakter yang harus tetap karakter diubah menjadi faktor. Untuk memperbaikinya,mutate_if()
fungsi ini digunakan untuk mendeteksi kolom yang merupakan faktor dan berubah menjadi karakter. Terakhir, saya ingin menunjukkan bagaimana lubridate dapat digunakan untuk mengubah stempel waktu di kelas karakter ke waktu-tanggal karena ini juga sering merupakan blok yang sulit bagi pemula.sumber
mutate_all(type.convert, as.is=TRUE)
alih-alihmutate_all(type.convert)
, Anda dapat menghapus / menghindarimutate_if(is.factor, as.character)
untuk mempersingkat perintah.as.is
adalah argumentype.convert()
yang menunjukkan apakah string harus dikonversi sebagai karakter atau sebagai faktor. Secara default,as.is=FALSE
ditype.convert()
(mis., Mengonversi string ke kelas faktor alih-alih kelas karakter).Tim sudah benar, dan Shane memiliki kekurangan. Berikut adalah contoh tambahan:
data.frame
Sekarang kami memiliki ringkasan kolom faktor (jumlah) dan ringkasan numerik darias.numeric()
--- yang salah karena mendapat tingkat faktor numerik --- dan ringkasan (yang benar) darias.numeric(as.character())
.sumber
Dengan kode berikut Anda dapat mengonversi semua kolom bingkai data menjadi numerik (X adalah bingkai data yang ingin Anda konversi kolomnya):
dan untuk mengubah seluruh matriks menjadi numerik Anda memiliki dua cara: Baik:
atau:
Sebagai alternatif, Anda dapat menggunakan
data.matrix
fungsi untuk mengubah segalanya menjadi numerik, meskipun perlu diingat bahwa faktor-faktor tersebut mungkin tidak dapat dikonversi dengan benar, jadi lebih aman untuk mengonversi semuanya menjadi yangcharacter
pertama:Saya biasanya menggunakan yang terakhir ini jika saya ingin mengkonversi ke matriks dan angka secara bersamaan
sumber
Jika Anda mengalami masalah dengan:
Lihatlah tanda desimal Anda. Jika mereka "," bukannya "." (mis. "5,3") di atas tidak akan berfungsi.
Solusi potensial adalah:
Saya percaya ini sangat umum di beberapa negara yang tidak berbahasa Inggris.
sumber
Cara universal menggunakan
type.convert()
danrapply()
:sumber
as.is = TRUE
jika Anda ingin mengonversi karakter Anda menjadi angka atau faktormatrix
ke perubahan numerik yang salahclasses=matrix
argumen pertama harus dari karakter modeUntuk mengonversi kolom bingkai data menjadi numerik, Anda cukup melakukan: -
faktor numerik: -
sumber
sapply(data_frame,function(x) as.numeric(as.character(x)))
Meskipun orang lain telah membahas topik dengan cukup baik, saya ingin menambahkan pemikiran / petunjuk cepat tambahan ini. Anda dapat menggunakan regexp untuk memeriksa terlebih dahulu apakah karakter yang berpotensi hanya terdiri dari angka.
Untuk ekspresi reguler yang lebih canggih dan alasan yang bagus untuk mempelajari / merasakan kekuatan mereka, lihat situs web yang sangat bagus ini: http://regexr.com/
sumber
Mengingat mungkin ada kolom char, ini didasarkan pada @Abdou di Dapatkan jenis lembar excel secara otomatis menjawab:
sumber
Di PC saya (R v.3.2.3),
apply
atausapply
berikan kesalahan.lapply
bekerja dengan baik.sumber
Jika kerangka data memiliki beberapa jenis kolom, beberapa karakter, beberapa numerik coba yang berikut ini untuk mengonversi hanya kolom yang berisi nilai numerik ke angka:
sumber
dengan hablar :: convert
Untuk dengan mudah mengonversi banyak kolom ke berbagai tipe data yang dapat Anda gunakan
hablar::convert
. Sintaks sederhana:df %>% convert(num(a))
mengonversi kolom a dari df ke numerik.Contoh terperinci
Mari kita konversi semua kolom
mtcars
menjadi karakter.Dengan
hablar::convert
:menghasilkan:
sumber
Untuk mengkonversi karakter ke numerik Anda harus mengubahnya menjadi faktor dengan menerapkan
Anda harus membuat dua kolom dengan data yang sama, karena satu kolom tidak dapat dikonversi menjadi angka. Jika Anda melakukan satu konversi itu memberikan kesalahan di bawah ini
jadi, setelah melakukan dua kolom data yang sama berlaku
itu akan berhasil mengubah karakter menjadi numerik
sumber
df
ist dataframe Anda.x
adalah kolomdf
yang ingin Anda konversisumber
Jika Anda tidak peduli tentang menjaga faktor-faktor, dan ingin menerapkannya ke kolom apa pun yang dapat dikonversi menjadi numerik, saya menggunakan skrip di bawah ini. jika df adalah kerangka data asli Anda, Anda dapat menggunakan skrip di bawah ini.
Saya mereferensikan solusi Shane dan Joran btw
sumber