R'de ondalık basamakları biçimlendirme


264

Ekrana çıktı (veya bir dosyaya yazılırken) yalnızca iki ondalık basamak olarak göstermek istiyorum, örneğin 1.128347132904321674821 bir numara var. biri bunu nasıl yapar?

x <- 1.128347132904321674821

DÜZENLE:

Kullanımı:

options(digits=2)

Olası bir cevap olarak önerilmiştir. Bunu bir kerelik kullanım için bir komut dosyasında belirtmenin bir yolu var mı? Komut dosyasına eklediğimde, farklı bir şey yapmıyor gibi görünüyor ve her sayıyı biçimlendirmek için çok fazla yeniden yazmayla ilgilenmiyorum (çok büyük bir raporu otomatikleştiriyorum).

-

Cevap: yuvarlak (x, basamak = 2)



Eğer seçenekler kullanılırsa (basamak = 4), bu hesaplamaları 4 basamakla sınırlamaz mı? Bu durumda programları çok daha az doğru yapar. YALNIZCA basıldığında sayıyı etkiler, doğru mu?
MikeZ

controls the number of digits to print when printing numeric values. It is a suggestion only. Valid values are 1...22 with default 7. See the note in print.default about values greater than 15.seçenekler yalnızca çıktıyı etkiler.
Brandon Bertelsen

Not round(23, digits=2)yazdırılacaktır 23değil 23.00. İkincisini istiyorsanız, stackoverflow.com/a/12135122/180892
Jeromy Anglim

4
@PaulHurleyuk, bence programlamada mümkün olan en az sayıda kütüphane kullanmak iyi bir uygulamadır. Her önemsiz ihtiyacı için farklı bir kütüphaneyi kullanan birisi genellikle vb bir karmaşa, büyük dosyalar, taşınabilirlik sorunları ile biter
Rodrigo

Yanıtlar:


381

Arka plan: Bu sayfada önerilen bazı yanıtlar (örn. signif, options(digits=...)) , Rasgele bir sayı için belirli sayıda ondalık sayı görüntüleneceğini garanti etmez. Bunun R'deki bir tasarım özelliği olduğunu düşünüyorum, burada iyi bilimsel uygulama " önemli figürler " ilkelerine dayalı olarak belirli sayıda basamak göstermeyi içerir . Bununla birlikte, birçok alanda (ör. APA stili , iş raporları) biçimlendirme gereksinimleri belirli sayıda ondalık basamağın gösterilmesini gerektirir. Bu genellikle önemli rakamlarla ilgilenmektense tutarlılık ve standardizasyon amacıyla yapılır.

Çözüm :

Aşağıdaki kod, sayı için tam olarak iki ondalık basamak gösterir x.

format(round(x, 2), nsmall = 2)

Örneğin:

format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"

Daha genel bir işlev aşağıdaki xsayıdır ve kgösterilecek ondalık sayıdır. trimwsbir sayı vektörünüz varsa yararlı olabilecek tüm önde gelen beyaz boşlukları kaldırır.

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))

Örneğin,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"

4
Benim için çalıştı 1 Sadece cevap, doğru basar 0.0001olarak0.00
ThomasH

7
Nümeriklerin karakterleri nasıl sevdiğini format()ve prettyNum()karakterlere dönüştürdüğünü her zaman rahatsız ediyordum. Bunu nasıl ele alırsınız?
Waldir Leoncio

Görüntülenen tırnak işaretleri nelerdir?
F.Webber

2
Çözelti yukarıda ondalık önünde örneğin karakter sayısı sabitleme olası bir kenar durum dezavantajı, @JeromyAnglim I not format(c(10, 1), nsmall=1)verim "10.0" " 1.0"(1.0 önüne gelen alan not edin. Oysa, sprintf()fonksiyon biçimlendirme güzel garanti görünmektedir örneğin ondalık, her iki tarafı da sprintf(c(10,1), fmt = '%#.1f')o sinir bozucu lider uzay ve getiri kurtulur "10.0" "1.0".
Nicholas G Reich

1
Öndeki boşluklar, formatbir sütunda sonucu kullanıldığında ondalık noktayı hizalamak için tasarlanmış bir özelliktir .
Yaşayan

34

Bir sayıyı, örneğin x, ondalık basamaklara kadar istediğiniz gibi biçimlendirebilirsiniz . İşte xondalık basamakları olan bir sayı. Bu sayının en fazla 8 ondalık basamağını göstermek istediğimizi varsayalım:

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"

Burada format="f", xxx.xxx gibi normal ondalık basamaklarda kayan sayılar verir ve digitsbasamak sayısını belirtir. Tersine, görüntülemek için bir tamsayı almak istiyorsanız format="d"(çok benzer sprintf) kullanırsınız.


OP'nin tam olarak ne istediğinden emin olmasam da, en yüksek puanlı cevaba bakarak, bu konuda formatCneredeyse tamamen kullandığımı gözlemleyemedim ama gözlemleyemedim . Bence bu cevap iyi ve OP'nin isteğine göre R bazında.
AdamO

herhangi biriniz bu konuda yardımcı olabilir? stackoverflow.com/q/53279593/5224236
gpier

24

Biçimlendirilebilir paketimi deneyebilirsiniz .

> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13

İyi olan şu ki, xyine de sayısal bir vektör ve aynı biçimlendirmeyle daha fazla hesaplama yapabilirsiniz.

> x + 1
[1] 2.13

Daha da iyisi, rakamlar kaybolmaz, istediğiniz zaman daha fazla rakamla yeniden biçimlendirebilirsiniz :)

> formattable(x, digits = 6, format = "f")
[1] 1.128347

Böyle küçük bir hıyar bütün sabah beni rahatsız ediyor. Herhangi bir nedenle R, ekranı yalnızca bir sütun için yuvarlar. Ben de bu sütunlarda hesaplamalar yapmak zorunda olduğu gibi bu düzeltmeye ihtiyacım vardı. Bu çalışıyor. Teşekkürler !
thethakuri

Ben herhangi bir baseR işlevlerinden daha biçimlendirilebilir seviyorum. En büyük avantajı değişkeni sayısal olarak tutar.
Lazarus Thurston

22

sondaki sıfırları tutmak istediğinizi varsayarak 2 ondalık basamak için

sprintf(5.5, fmt = '%#.2f')

hangi verir

[1] "5.50"

@Mpag'den bahsedildiği gibi, R bazen bununla beklenmedik değerler verebilir ve yuvarlak yöntem örneğin sprintf (5.5550, fmt = '% #. 2f') 5.56 değil 5.55 verir


1
ancak sprintf yuvarlansa da sprintf (5.5550, fmt = '% #. 2f') biraz beklenmedik bir sonuç verir: 5.55. sprintf (5.555000000001, fmt = '% #. 2f') 5.56 değerini verir. Yuvarlak, nsmall yöntemi aynı şekilde verdiği için bu, R'de yuvarlama ile ilgili genel bir "sorun" olarak görünmektedir.
mpag

Teşekkürler @mpag, R'nin sınırlarda yuvarlama ile uğraştığı hakkında hiçbir fikrim yoktu, 5.545 mermi alırken 5.565 ile denedim. Sanırım kayan nokta girişini ele alma biçimleri bu. Bu davranışı diğer dillerde gördüğümü sanmıyorum ki bu onların yerleşik bir geçici çözümü olduğu anlamına geliyor
Mark Adamson

Bunun yerine, değerlere kasıtlı olarak kesinlik derecesinde sınırlı muamele ettiklerini düşünüyorum. 5.555 olan bir değerin, 5.55546 olarak 5.5546 "gerçek" değerden kaynaklanmış olabileceğini düşünüyorlar. Ancak, bu tür bir yuvarlama oyununa devam ederseniz, her seferinde bir basamak yaparsanız 5.444445 (denenmemiş) "6" olarak sonuçlanabilir. Ancak, ikili gösterimin 5.55'in biraz altında veya üzerinde olması meselesi olabilirsiniz.
18'de

Evet, bence kasıtlı olsaydı 5.565 ve 5.545 arasında da tutarlı olurdu. 'Rastgele' bana bir kayan nokta temsil şey olduğunu gösteriyor.
Mark Adamson

herhangi biriniz bu konuda yardımcı olabilir? stackoverflow.com/q/53279593/5224236
gpier

8

Bunun gibi bir şey :

options(digits=2)

Basamak seçeneğinin tanımı:

digits: controls the number of digits to print when printing numeric values.

Bir komut dosyası çalıştırırken bunu dinamik olarak ayarlamanın bir yolu var mı?
Brandon Bertelsen

Bu, R konsolu içinde çıktı almak için çalışıyor, ancak senaryomda çalışmıyor (hala .1289273982 ile çıkıyorlar)
Brandon Bertelsen

1
Garip bir davranış alıyorum, digitsseçenek ondalık basamaktan sonra basamak sayısını ayarlamıyor gibi görünüyor. Örneğin, seçenekleri ayarladığımda (basamaklar = 2), 7.25 yazdırıldığında 7.2, 1234.25 çıktısı 1234 olur ve 0.25 0.25 olarak kalır. Bununla etkileşime giren başka bir seçenek var mı?
Maxim.K

8

Kontrol fonksiyonları prettyNum, biçim

sıfırlayan sıfırlara sahip olmak (örneğin 123.1240) kullanmak sprintf(x, fmt='%#.4g')


@ 42 Öğrenmeyi savunacağım sprintf, temel olarak biçimlendirme için bir çerçeve
jangorecki

1
@jangorecki Ne demek istediğinden emin değilim. Tek yaptığım (5+ yıl önce) bir yazım düzeltmesi önermekti.
IRTFM

@ 42 Argünden şikayet etmenizi istiyorum fmt, üzgünüm!
jangorecki

Bence OP sabit rakamlar yerine sabit ondalık basamaklardan sonra. Görünüşe göre gcevabınız sabit basamaklar için, fişleri daha iyi kullanmaktır .
Mark Adamson

5

Sabit basamaklara göre önemli basamakları tercih ederseniz, signif komutu yararlı olabilir:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300

1
Teşekkürler Paul. Bu ikisi tam olarak aradığım şey değildi, ama signif beni tam olarak ihtiyacım olan şeydir. Şerefe,
Brandon Bertelsen

34
Error: could not find function "fixed"
ThomasH

signifverilen belirli sayı için çalışır, ancak yaygın olarak uygulanan sorunun tam olarak iki ondalık basamak göstermeniz gerektiğinde olduğunu düşünüyorum, ancak sayının önceden ne olduğunu bilmiyorsunuz. Bu durumda, signifgerçek sayıya bağlı olarak farklı ondalık sayılar verecektir.
Jeromy Anglim

3
sabit hiçbir yerde bulunamadı. Lütfen düzeltin, aksi takdirde bu yanıltıcı cevap silinmelidir.
HelloWorld

@JeromyAnglim 3sf istediğimizde bunu nasıl düzeltiriz? bazen bana 3sf, diğer zamanlarda 4sf, vb. verir, bunu nasıl düzeltiriz?
christouandr7

4

İşlev formatC(), bir sayıyı iki ondalık basamağa biçimlendirmek için kullanılabilir. Elde edilen değerler sondaki sıfırlar olsa bile, bu işlev tarafından iki ondalık basamak verilir.


3

Bu varyantı zorla baskı K ondalık basamakları için kullanıyorum:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)

2

R'deki sayısal nesnelerin çift ​​hassasiyetle saklandığını unutmayın , bu size (kabaca) 16 ondalık basamak basamağı verir - gerisi gürültü olacaktır. Yukarıda gösterilen sayının muhtemelen sadece bir örnek için olduğunu, ancak 22 basamak uzunluğunda olduğunu düşünüyorum.


3
Onaylandı, sadece bir örnek için. Klavyeyi ezdim.
Brandon Bertelsen

1

Bana öyle bir şey gibi görünüyor

library(tutoR)
format(1.128347132904321674821, 2)

Biraz çevrimiçi yardım başına .


Bunu buldum, ancak bir paket gerektiriyor, temel paket içinde bir şey arıyorum.
Brandon Bertelsen

2
@brandon, format () temelin bir parçasıdır. R'yi açın ve? Format ... yazın, paket gerekmez.
JD Long

Hrmmm, bunun çıktılarına baktınız mı? [1] "1.128347" Aksi takdirde, temel pakette yer almakta oldukça haklısın, benim hatam.
Brandon Bertelsen

1
Belki de format.default(x, digits = 2)sağlanan bağlantıya dayanarak karanlıkta sadece bir atış deneyin . Bu bilgi, normalde belgeleme için okuduğum şeylerden bazıları, yazdırılan çıktıları da görmeyi bekledim.
Tim Meers

Sadece bağlantınızın tabanın bir parçası olmayan tutoR belgelerine işaret ettiğini fark ettim.
Brandon Bertelsen

1

sadece bir sayıyı veya listeyi yuvarlamak istiyorsanız,

round(data, 2)

Ardından, veriler 2 ondalık basamağa yuvarlanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.