Memaksa R untuk tidak menggunakan notasi eksponensial (mis. E + 10)?

228

Bisakah saya memaksa R untuk menggunakan angka biasa daripada menggunakan e+10notasi-like? Saya sudah:

1.810032e+09
# and 
4

dalam vektor yang sama dan ingin melihat:

1810032000
# and
4

Saya membuat output untuk program kuno dan saya harus menulis file teks menggunakan cat. Sejauh ini itu berfungsi dengan baik, tetapi saya tidak bisa menggunakan e+10notasi di sana.

Matt Bannert
sumber
Terkait: stackoverflow.com/q/3978266/134830
Richie Cotton

Jawaban:

228

Ini sedikit area abu-abu. Anda harus ingat bahwa R akan selalu memanggil metode cetak, dan metode cetak ini mendengarkan beberapa opsi. Termasuk 'scipen' - penalti untuk tampilan ilmiah. Dari help(options):

'scipen': integer. Hukuman yang akan diterapkan ketika memutuskan untuk mencetak nilai numerik dalam notasi tetap atau eksponensial. Nilai-nilai positif bias terhadap tetap dan negatif terhadap notasi ilmiah: notasi tetap akan lebih disukai kecuali itu lebih dari angka 'scipen' yang lebih luas.

Contoh:

R> ran2 <- c(1.810032e+09, 4) 
R> options("scipen"=-100, "digits"=4)
R> ran2
[1] 1.81e+09 4.00e+00
R> options("scipen"=100, "digits"=4)
R> ran2
[1] 1810032000          4

Yang mengatakan, saya masih menganggapnya fudgeworthy. Cara paling langsung adalah dengan menggunakan sprintf()misalnya eksplisit lebar sprintf("%.5f", ran2).

Dirk Eddelbuettel
sumber
1
Terima kasih. Scipen tampaknya menjadi pilihan yang saya cari. Penjelasan hukuman yang menyeramkan membuat saya menghindar. Tetapi teladan Anda menjelaskannya dengan baik. sprintf, ya? Anda mengacu pada masalah saya dengan sprintf seminggu yang lalu? :)
Matt Bannert
4
Di rstudio, jika Anda mengimpor dataset dan melakukan train_sample_10k = format (train_sample_10k, scientific = FALSE) dan memuat ulang, itu akan mengubah notasi ilmiah.
mixdev
Bagaimana saya mengembalikan hal-hal normal setelah melakukan ini?
AIM_BLB
6
@CSA: options("scipen"=0, "digits"=7)(itu adalah nilai default)
Scarabee
Anda harus memindahkan yang mencapai hasil options("scipen"=100, "digits"=4)ke atas kode, dan yang tidak di bawahnya ... dengan catatan yang sesuai. Ini bisa membingungkan bagi seseorang yang mencari solusi cepat (dan Google menunjukkan yang pertama sebagai hasilnya).
xbsd
152

Ini dapat dicapai dengan menonaktifkan notasi ilmiah di R.

options(scipen = 999)
GingerJack
sumber
4
Selain itu, ini dapat dimasukkan ke dalam file profil Anda sehingga dijalankan secara otomatis.
smci
74

Jawaban favorit saya:

format(1810032000, scientific = FALSE)
# [1] "1810032000"

Ini memberikan apa yang Anda inginkan tanpa harus muck dalam pengaturan R.

Perhatikan bahwa ia mengembalikan string karakter daripada objek angka

Danny
sumber
1
Hm itu aneh, itu tidak berhasil untuk saya. Saya tidak mendapatkan kesalahan, hanya mencetak notasi ilmiah.
Ovi
Tidak yakin apa yang salah. Saya telah memeriksa versi R yang sangat lama (3.1.0) dan baru (3.4.3) dan berfungsi untuk saya di keduanya. Kemungkinan besar beberapa pengaturan lain di suatu tempat lebih diutamakan atau Anda menemukan bug versi khusus atau case-edge di R. Apakah mungkin Anda memberinya string dalam notasi ilmiah daripada objek numerik? Itu akan menjelaskannya.
Danny
10
Mungkin patut dicatat bahwa ini menciptakan karakter alih-alih angka.
cengel
3
Jika angka-angka dalam vektor Anda memiliki panjang yang berbeda-beda, pastikan untuk menggunakan justified = "none"atau kalau tidak akan ada spasi yang memasukkan mereka ke panjang yang sama.
Lauren Fitch
1
format(1e6, scientific=FALSE)kembali "1000000"sambil as.character(1e6)kembali "1e+06", jadi ada perbedaan antara kedua metode.
mickey
7

Masukkan file .Rprofileoptions(scipen = 999) Anda sehingga secara otomatis dieksekusi . (Jangan mengandalkan melakukannya secara manual.)

(Ini mengatakan sesuatu yang berbeda dengan jawaban lain: bagaimana?

  1. Hal ini membuat hal-hal tetap waras ketika Anda melakukan berbagai proyek, berbagai bahasa setiap hari atau bulanan. Ingat untuk mengetikkan pengaturan per proyek Anda rawan kesalahan dan tidak dapat diskalakan. Anda dapat memiliki profil global ~ / .Rprile atau per proyek .Rprofil. Atau keduanya, dengan yang terakhir menimpa yang pertama.
  2. Mempertahankan semua konfigurasi Anda di seluruh proyek atau global. Profil otomatis menjalankannya. Ini berguna untuk mis. Pemuatan paket default, konfigurasi data.table, lingkungan, dll. Sekali lagi, konfigurasi itu dapat berjalan ke halaman pengaturan, dan tidak ada kemungkinan Anda akan mengingatnya dan sintaksanya dan mengetikkannya di
smci
sumber
Mengapa jawaban yang persis sama? stackoverflow.com/a/27318351/680068 Terlepas dari bit Rprofile, mungkin lebih baik mengedit jawaban GingerJack?
zx8754
@ zx8754: ini bukan jawaban yang persis sama: titik krusialnya adalah memindahkan barang-barang ini ke .Rprofile Anda. Maka Anda tidak akan pernah bisa melupakannya. Juga, seiring berjalannya waktu. Profil Anda mengakumulasikan semua penyesuaian Anda.
smci
1
Terserah Anda tentu saja, tetapi Q bukan "bagaimana saya tidak bisa lupa untuk melakukan X" tetapi "bagaimana saya bisa melakukan X".
zx8754
@ zx8754: Saya menemukan antara R dan Python / panda pada beberapa proyek setiap hari. Keduanya memiliki kustomisasi, jalur paket dll. Ini benar-benar membuat hal-hal yang waras untuk memiliki satu file konfigurasi umum menyimpannya. Lintas proyek.
smci
1
@ zx8754: ketika Anda mengerjakan beberapa proyek di berbagai bahasa, pertanyaan "bagaimana saya bisa melakukan X" bergabung dengan "bagaimana saya tidak bisa lupa untuk melakukan X", dengan cara otomatis yang dapat diskalakan, konsisten, dan otomatis. Saya hanya menambahkan lebih banyak penjelasan. Bagi siapa pun drive-by downvoter adalah.
smci