Saya memiliki satu set data yang terlihat seperti ini:
anim <- c(25499,25500,25501,25502,25503,25504)
sex <- c(1,2,2,1,2,1)
wt <- c(0.8,1.2,1.0,2.0,1.8,1.4)
data <- data.frame(anim,sex,wt)
data
anim sex wt anim2
1 25499 1 0.8 2
2 25500 2 1.2 2
3 25501 2 1.0 2
4 25502 1 2.0 2
5 25503 2 1.8 2
6 25504 1 1.4 2
Saya ingin nol ditambahkan sebelum setiap id hewan:
data
anim sex wt anim2
1 025499 1 0.8 2
2 025500 2 1.2 2
3 025501 2 1.0 2
4 025502 1 2.0 2
5 025503 2 1.8 2
6 025504 1 1.4 2
Dan demi kepentingan, bagaimana jika saya perlu menambahkan dua atau tiga nol sebelum id hewan?
data$anim = paste(rep(0, n), data$anim, sep = "")
Jawaban:
Versi singkat: gunakan
formatC
atausprintf
.Versi yang lebih panjang:
Ada beberapa fungsi yang tersedia untuk memformat angka, termasuk menambahkan angka nol di depan. Yang mana yang terbaik tergantung pada format apa yang ingin Anda lakukan.
Contoh dari pertanyaan ini cukup mudah karena semua nilai memiliki jumlah digit yang sama untuk memulai, jadi mari kita coba contoh yang lebih sulit untuk membuat kekuatan 10 lebar 8 juga.
paste
(dan variannyapaste0
) seringkali merupakan fungsi manipulasi string pertama yang Anda temui. Mereka tidak benar-benar dirancang untuk memanipulasi angka, tetapi mereka dapat digunakan untuk itu. Dalam kasus sederhana di mana kita selalu harus menambahkan satu nol,paste0
adalah solusi terbaik.Untuk kasus di mana ada jumlah variabel angka dalam angka, Anda harus menghitung secara manual berapa banyak nol untuk ditambahkan, yang cukup mengerikan sehingga Anda hanya harus melakukannya karena penasaran yang tidak wajar.
str_pad
daristringr
karya yang mirip denganpaste
, membuatnya lebih eksplisit bahwa Anda ingin memberi pad hal.Sekali lagi, itu tidak benar-benar dirancang untuk digunakan dengan angka, sehingga kasus yang lebih sulit memerlukan sedikit pemikiran. Kita hanya bisa mengatakan "pad dengan nol ke lebar 8", tetapi lihat output ini:
Anda perlu mengatur opsi penalti ilmiah sehingga angka selalu diformat menggunakan notasi tetap (bukan notasi ilmiah).
stri_pad
dalamstringi
karya persis sepertistr_pad
daristringr
.formatC
adalah sebuah antarmuka untuk fungsi Cprintf
. Menggunakannya membutuhkan beberapa pengetahuan tentang arcana dari fungsi yang mendasarinya (lihat tautan). Dalam hal ini, poin penting adalahwidth
argumen,format
yang"d"
untuk "integer", dan"0"
flag
untuk mengawali nol.Ini adalah solusi favorit saya, karena mudah untuk bermain-main dengan mengubah lebar, dan fungsinya cukup kuat untuk membuat perubahan format lainnya.
sprintf
adalah antarmuka ke fungsi C dengan nama yang sama; sukaformatC
tetapi dengan sintaks yang berbeda.Keuntungan utama
sprintf
adalah Anda dapat menyematkan angka yang diformat ke dalam bit teks yang lebih panjang.Lihat juga jawaban goodside .
Untuk kelengkapannya, perlu disebutkan fungsi pemformatan lain yang kadang-kadang berguna, tetapi tidak memiliki metode untuk menambahkan nol.
format
, fungsi generik untuk memformat objek apa pun, dengan metode untuk angka. Ini bekerja sedikit sepertiformatC
, tetapi dengan antarmuka yang lain.prettyNum
adalah fungsi pemformatan lain, sebagian besar untuk membuat label centang sumbu manual. Ini bekerja sangat baik untuk rentang angka yang luas.The
scales
paket memiliki beberapa fungsi sepertipercent
,date_format
dandollar
untuk jenis format yang spesialis.sumber
flag = "0"
.?sprintf
halaman bantuan menjelaskan hal ini. "mn: Dua angka dipisahkan oleh tanda titik, menunjukkan lebar bidang (m) dan ketepatan (n)."Untuk solusi umum yang berfungsi terlepas dari berapa banyak digit yang ada
data$anim
, gunakansprintf
fungsi ini. Ini berfungsi seperti ini:Dalam kasus Anda, Anda mungkin ingin:
data$anim <- sprintf("%06d", data$anim)
sumber
sprintf
mengubah angka menjadi string (karakter).Memperluas pada repsonse @ goodside:
Dalam beberapa kasus, Anda mungkin ingin menambahkan string dengan nol (misalnya kode fips atau faktor seperti numerik lainnya). Di OSX / Linux:
Tetapi karena
sprintf()
memanggil perintah OS Csprintf()
, dibahas di sini , di Windows 7 Anda mendapatkan hasil yang berbeda:Jadi pada mesin Windows yang bekerja di sekitar adalah:
sumber
str_pad
sekarang menjadi tujuan saya.str_pad
daristringr
paket adalah alternatif.sumber
str_pad
karena dapat menyebabkan hasil yang tidak terduga.i.num = 600000
;str_pad(i.num, width = 7, pad = "0")
akan memberi Anda "006e + 05" dan bukan "0600000"Inilah fungsi dasar R yang dapat digeneralisasikan:
Saya suka
sprintf
tetapi disertai dengan peringatan seperti:sumber
Berikut ini adalah alternatif lain untuk menambahkan mengarah ke 0s ke string seperti CUSIPs yang kadang-kadang dapat terlihat seperti angka dan yang banyak aplikasi seperti Excel akan merusak dan menghapus 0s terkemuka atau mengubahnya menjadi notasi ilmiah.
Ketika saya mencoba jawaban yang diberikan oleh @metasequoia, vektor yang dikembalikan memiliki spasi terdepan dan bukan
0
s. Ini adalah masalah yang sama yang disebutkan oleh @ user1816679 - dan menghapus tanda kutip di sekitar0
atau mengubah dari%d
menjadi%s
tidak membuat perbedaan juga. FYI, saya menggunakan RStudio Server yang berjalan di Server Ubuntu. Solusi dua langkah kecil ini bekerja untuk saya:gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))
menggunakan
%>%
fungsi pipa darimagrittr
paket itu bisa terlihat seperti ini:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
Saya lebih suka solusi satu-fungsi, tetapi berhasil.
sumber
sumber
paste0(0, data$anim)
akan bekerja dengan baik.Untuk keadaan lain di mana Anda ingin string angka konsisten, saya membuat suatu fungsi.
Seseorang mungkin menganggap ini berguna:
Maaf tentang pemformatan.
sumber