Định dạng các vị trí thập phân trong R


264

Tôi có một số, ví dụ 1.128347132904321674821 mà tôi muốn chỉ hiển thị dưới dạng hai chữ số thập phân khi xuất ra màn hình (hoặc ghi vào tệp). Làm thế nào để làm điều đó?

x <- 1.128347132904321674821

BIÊN TẬP:

Việc sử dụng:

options(digits=2)

Đã được đề xuất như một câu trả lời có thể. Có cách nào để xác định điều này trong một tập lệnh để sử dụng một lần không? Khi tôi thêm nó vào tập lệnh của mình, nó dường như không làm gì khác và tôi không quan tâm đến việc gõ lại để định dạng từng số (Tôi đang tự động hóa một báo cáo rất lớn).

-

Trả lời: vòng (x, chữ số = 2)



Nếu một người sử dụng các tùy chọn (chữ số = 4), điều đó không giới hạn các phép tính ở 4 chữ số, phải không? Trong trường hợp đó, nó sẽ làm cho các chương trình ít chính xác hơn. Nó CHỈ ảnh hưởng đến số khi nó được in, đúng không?
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.từ? tùy chọn nó chỉ có hiệu lực đầu ra.
Brandon Bertelsen

Lưu ý rằng round(23, digits=2)sẽ in 23và không 23.00. Nếu bạn muốn thứ hai, hãy thử stackoverflow.com/a/12135122/180892
Jeromy Anglim

4
@PaulHurleyuk, tôi nghĩ rằng đó là cách thực hành tốt trong lập trình để sử dụng số lượng thư viện tối thiểu nhất có thể. Một người nào đó sử dụng một thư viện khác nhau cho mỗi nhu cầu tầm thường thường kết thúc với một mớ hỗn độn, các tệp lớn, các vấn đề về tính di động, v.v.
Rodrigo

Câu trả lời:


381

Bối cảnh: Một số câu trả lời gợi ý trên trang này (ví dụ signif, options(digits=...)) không đảm bảo rằng một số lượng nhất định của số thập phân được hiển thị cho một số tùy ý. Tôi cho rằng đây là một tính năng thiết kế trong R, theo đó thực tiễn khoa học tốt liên quan đến việc hiển thị một số chữ số nhất định dựa trên các nguyên tắc của "các số liệu quan trọng ". Tuy nhiên, trong nhiều tên miền (ví dụ: kiểu APA , báo cáo doanh nghiệp) yêu cầu định dạng cho rằng một số vị trí thập phân nhất định được hiển thị. Điều này thường được thực hiện cho mục đích thống nhất và tiêu chuẩn hóa hơn là quan tâm đến các số liệu quan trọng.

Giải pháp :

Đoạn mã sau hiển thị chính xác hai chữ số thập phân cho số x.

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

Ví dụ:

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"

Một hàm tổng quát hơn như sau trong đó xlà số và klà số thập phân cần hiển thị. trimwsloại bỏ bất kỳ khoảng trắng hàng đầu nào có thể hữu ích nếu bạn có một vectơ số.

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

Ví dụ,

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

4
+1 Chỉ có câu trả lời phù hợp với tôi, được in chính xác 0.0001như0.00
ThomasH

7
Nó luôn làm phiền tôi về cách các chức năng thích format()prettyNum()biến số thành các ký tự. Làm thế nào bạn sẽ giải quyết điều này?
Waldir Leoncio

Những gì với dấu ngoặc kép xuất hiện?
F.Webber

2
@JeromyAnglim Tôi lưu ý rằng giải pháp ở trên có nhược điểm trường hợp cạnh có thể xảy ra là sửa số lượng ký tự trước số thập phân, ví dụ như format(c(10, 1), nsmall=1)sản lượng"10.0" " 1.0" (lưu ý khoảng trắng ở phía trước 1.0. Trong khi đó, sprintf()hàm dường như đảm bảo định dạng đẹp hơn trên cả hai mặt của số thập phân, ví dụ như sprintf(c(10,1), fmt = '%#.1f')thoát khỏi không gian hàng đầu phiền phức đó và quay trở lại "10.0" "1.0".
Nicholas G Reich

1
Các không gian hàng đầu là một tính năng được thiết kế để căn chỉnh dấu thập phân khi kết quả formatđược sử dụng trong một cột.
Cư dân

34

Bạn có thể định dạng một số, giả sử x, đến số thập phân như bạn muốn. Đây xlà một số có nhiều chữ số thập phân. Giả sử chúng tôi muốn hiển thị tối đa 8 chữ số thập phân của số này:

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

Ở đây format="f"đưa ra các số trôi nổi ở các vị trí thập phân thông thường, nói là xxx.xxx và digitschỉ định số chữ số. Ngược lại, nếu bạn muốn lấy một số nguyên để hiển thị, bạn sẽ sử dụng format="d"(rất giống sprintf).


Mặc dù tôi không rõ chính xác những gì OP đã hỏi, đánh giá bằng câu trả lời được đánh giá cao nhất, tôi không thể không quan sát đó formatCgần như là những gì tôi sử dụng cho mục đích này. Tôi nghĩ rằng câu trả lời này là tốt và nằm trong cơ sở R theo yêu cầu của OP.
AdamO

bất cứ ai trong số các bạn có thể giúp đỡ về điều này? stackoverflow.com/q/53279593/5224236
gpier

24

Bạn có thể thử gói của tôi có thể định dạng .

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

Điều tốt là, xvẫn là một vectơ số và bạn có thể thực hiện nhiều phép tính hơn với cùng định dạng.

> x + 1
[1] 2.13

Thậm chí tốt hơn, các chữ số không bị mất, bạn có thể định dạng lại với nhiều chữ số hơn bất cứ lúc nào :)

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

Như một cái gai nhỏ xíu làm tôi đau cả buổi sáng. Vì một số lý do, R sẽ làm tròn màn hình cho một số cột. Tôi cần sửa lỗi này vì tôi cũng phải thực hiện các tính toán trên các cột đó. Những công việc này. Cảm ơn !
thethakuri

Tôi thích formattable hơn bất kỳ chức năng cơ sở. Ưu điểm lớn nhất nó giữ lại biến là số.
Lazarus Thurston

22

cho 2 vị trí thập phân giả sử rằng bạn muốn giữ các số 0 ở cuối

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

cái nào cho

[1] "5.50"

Như @mpag đề cập bên dưới, có vẻ như R đôi khi có thể đưa ra các giá trị không mong muốn với phương thức này và phương thức làm tròn, ví dụ sprintf (5.5550, fmt = '% #. 2f') cho 5.55, không phải 5.56


1
tuy nhiên, mặc dù các vòng sprintf, sprintf (5.5550, fmt = '% #. 2f') cho kết quả hơi bất ngờ: 5.55. sprintf (5.555000000001, fmt = '% #. 2f') cho 5.56. Đây dường như là một "vấn đề" chung với làm tròn trong R, vì phương pháp nsmall làm tròn giống nhau.
MPAG

Cảm ơn @mpag, tôi không biết rằng R đã vật lộn với việc làm tròn các ranh giới, tôi đã thử nó với 5.565, làm tròn lên, trong khi 5.545 vòng xuống. Tôi đoán đó là cách họ đang xử lý điểm nổi. Tôi không nghĩ rằng tôi đã thấy hành vi này trong các ngôn ngữ khác mà tôi đoán có nghĩa là họ có một cách giải quyết tích hợp
Mark Adamson

Tôi nghĩ đúng hơn là họ cố tình coi các giá trị bị giới hạn ở mức độ chính xác. Họ đang tìm ra rằng một giá trị là 5,555 thực sự có khả năng là kết quả từ giá trị "thực" của 5,5546 là 5,5554. Tuy nhiên, nếu bạn tiếp tục loại trò chơi làm tròn đó, 5.444445 có thể (chưa được kiểm tra) kết thúc là "6" nếu bạn thực hiện từng chữ số một. Nhưng bạn có thể đúng rằng đó có thể là vấn đề của biểu diễn nhị phân dưới một chút hoặc trên 5,55.
mpag

Vâng, tôi nghĩ rằng nếu đó là cố ý thì nó cũng sẽ phù hợp giữa 5.565 và 5.545. 'Tính ngẫu nhiên' gợi ý cho tôi đó là một điều đại diện cho dấu chấm động.
Đánh dấu Adamson

bất cứ ai trong số các bạn có thể giúp đỡ về điều này? stackoverflow.com/q/53279593/5224236
gpier

8

Một cái gì đó như thế:

options(digits=2)

Định nghĩa tùy chọn chữ số:

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

Có cách nào để thiết lập động này khi chạy tập lệnh không?
Brandon Bertelsen

Điều này hoạt động để xuất ra trong bảng điều khiển R, nhưng không hoạt động trong kịch bản của tôi (chúng vẫn xuất hiện cùng với .1289273982)
Brandon Bertelsen

1
Tôi nhận được một hành vi kỳ lạ, digitstùy chọn dường như không đặt số chữ số sau số thập phân. Ví dụ: khi tôi đặt tùy chọn (chữ số = 2), sau đó in 7,25 kết quả trong đầu ra 7.2, 1234.25 trở thành 1234 và 0,25 vẫn là 0,25. Có một lựa chọn khác tương tác với điều này?
Maxim.K

8

Kiểm tra chức năng PrettyNum, định dạng

để có các số không trialling (ví dụ 123.1240) sprintf(x, fmt='%#.4g')


@ 42 Tôi sẽ ủng hộ để tìm hiểu sprintf, về cơ bản nó là một khung để định dạng
jangorecki

1
@jangorecki Tôi không chắc về quan điểm của bạn. Tất cả những gì tôi đã làm (hơn 5 năm trước) là đề nghị sửa lỗi chính tả.
IRTFM

@ 42 Tôi khó khăn khi bạn phàn nàn về fmtarg, xin lỗi!
jangorecki

Tôi nghĩ OP nằm sau các số thập phân cố định thay vì các chữ số cố định. Có vẻ như gtrong câu trả lời của bạn là cho các chữ số cố định, sử dụng fhoạt động tốt hơn.
Đánh dấu Adamson

5

Nếu bạn thích các chữ số có nghĩa hơn các chữ số cố định thì lệnh Signif có thể hữu ích:

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

1
Cảm ơn Paul. Cả hai không chính xác những gì tôi đang tìm kiếm, nhưng điều đó đã dẫn tôi đến vòng () chính xác là những gì tôi cần. Chúc mừng,
Brandon Bertelsen

34
Error: could not find function "fixed"
ThomasH

signifhoạt động cho số cụ thể được cung cấp, nhưng tôi cho rằng vấn đề được áp dụng phổ biến là khi bạn cần hiển thị chính xác hai chữ số thập phân nhưng bạn không biết con số nào trước thời hạn. Trong trường hợp đó, signifsẽ đưa ra số thập phân khác nhau tùy thuộc vào số thực tế.
Jeromy Anglim

3
cố định không tìm thấy ở bất cứ đâu. Vui lòng sửa nó, nếu không câu trả lời sai lệch này sẽ bị xóa.
HelloWorld

@JeromyAnglim làm thế nào để chúng tôi sửa lỗi đó khi chúng tôi muốn 3sf? đôi khi nó mang lại cho tôi 3sf, lần khác 4sf, v.v ... làm thế nào để chúng tôi sửa lỗi này?
christouandr7

4

Hàm này formatC()có thể được sử dụng để định dạng một số đến hai chữ số thập phân. Hai vị trí thập phân được cho bởi hàm này ngay cả khi các giá trị kết quả bao gồm các số 0 ở cuối.


3

Tôi đang sử dụng biến thể này để in số thập phân K:

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

2

Lưu ý rằng các đối tượng số trong R được lưu trữ với độ chính xác gấp đôi , cung cấp cho bạn (khoảng) 16 chữ số thập phân chính xác - phần còn lại sẽ là nhiễu. Tôi cho rằng số hiển thị ở trên có lẽ chỉ là một ví dụ, nhưng nó dài 22 chữ số.


3
Khẳng định, đó chỉ là một ví dụ. Tôi nghiền bàn phím.
Brandon Bertelsen

1

Có vẻ như tôi sẽ giống như

library(tutoR)
format(1.128347132904321674821, 2)

Mỗi một sự giúp đỡ trực tuyến .


Tôi đã tìm thấy cái này, nhưng nó đòi hỏi một gói, tôi đang tìm thứ gì đó trong gói cơ sở.
Brandon Bertelsen

2
@brandon, format () là một phần của cơ sở. Mở R và gõ? Định dạng ... không cần gói.
JD Long

Hrmmm, bạn đã xem những gì đầu ra này? [1] "1.128347" nếu không, bạn hoàn toàn đúng về việc nó nằm trong gói cơ sở, điều xấu của tôi.
Brandon Bertelsen

1
Có lẽ hãy thử format.default(x, digits = 2)chỉ một phát bắn trong bóng tối mặc dù dựa trên liên kết được cung cấp. Thông tin đó là một số thứ còn thiếu so với những gì tôi thường đọc cho tài liệu, tôi dự kiến ​​cũng sẽ thấy các đầu ra được in.
Tim Meers

Chỉ cần lưu ý rằng liên kết của bạn trỏ đến tài liệu tutoR, không phải là một phần của cơ sở.
Brandon Bertelsen

1

nếu bạn chỉ muốn làm tròn một số hoặc một danh sách, chỉ cần sử dụng

round(data, 2)

Sau đó, dữ liệu sẽ được làm tròn đến 2 chữ số thập phân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.