R에서 소수 자릿수 서식


264

화면에 출력하거나 파일에 쓸 때 소수점 이하 두 자리 만 표시하고 싶은 숫자 (예 : 1.128347132904321674821)가 있습니다. 어떻게합니까?

x <- 1.128347132904321674821

편집하다:

사용 :

options(digits=2)

가능한 답변으로 제안되었습니다. 스크립트에서 한 번만 사용하도록 지정하는 방법이 있습니까? 스크립트에 추가하면 다른 일을하는 것처럼 보이지 않으며 각 숫자를 형식화하기 위해 다시 입력하는 데 관심이 없습니다 (매우 큰 보고서를 자동화합니다).

-

답 : 반올림 (x, 숫자 = 2)



옵션 (digits = 4)을 사용하면 계산이 4 자리로 제한되지 않습니까? 이 경우 프로그램의 정확도가 훨씬 떨어집니다. 인쇄 할 때만 숫자에 영향을 미칩니다. 맞습니까?
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.? 옵션에서 출력에만 영향을 미칩니다.
Brandon Bertelsen

참고 round(23, digits=2)인쇄됩니다 23하지 23.00. 후자를 원한다면 stackoverflow.com/a/12135122/180892
Jeromy Anglim

4
@PaulHurleyuk, 가능한 한 최소한의 라이브러리를 사용하는 것이 프로그래밍에 좋은 습관이라고 생각합니다. 각 사소한 필요에 대해 다른 라이브러리를 사용하는 사람은 대개 혼란, 큰 파일, 이식성 문제 등으로 끝납니다.
Rodrigo

답변:


381

배경 : 이 페이지에 제안 일부 답변은 (예를 들면, signif, options(digits=...)) 소수의 특정 수의 임의의 수에 대해 표시되는 것을 보장하지 않습니다. 나는 이것이 R의 디자인 기능이라고 가정한다. 좋은 과학적 실천은 " 유의 한 수치 "의 원리에 기초하여 특정 숫자를 보여주는 것을 포함한다 . 그러나 많은 도메인 (예 : APA 스타일 , 비즈니스 보고서)의 형식 요구 사항에 따라 소수 자릿수가 표시됩니다. 이것은 종종 중요한 수치가 아닌 일관성 및 표준화 목적으로 수행됩니다.

해결책 :

다음 코드는 숫자의 소수점 이하 두 자리를 정확하게 보여줍니다 x.

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

예를 들면 다음과 같습니다.

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"

보다 일반적인 함수는 여기서 다음과 x수 있으며 k보여 소수점 수이다. trimws숫자 벡터가있는 경우 유용 할 수있는 선행 공백을 제거합니다.

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

예 :

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

4
나를 위해 일한 1 만 대답은 제대로 인쇄 0.00010.00
ThomasH

7
함수가 숫자를 문자로 변환 format()하고 prettyNum()변환 하는 방법을 항상 귀찮게했습니다 . 이 문제를 어떻게 해결 하시겠습니까?
Waldir Leoncio

따옴표는 무엇입니까?
F.Webber

2
@JeromyAnglim 위의 솔루션은 소수 앞에 문자 수를 수정하는 경우 가능한 대소 문자 단점을 나타 format(c(10, 1), nsmall=1)냅니다 "10.0" " 1.0"( 예 : 수율 (1.0 앞의 앞 공간에 주목하십시오). 반면에 sprintf()함수는 더 나은 형식을 보장하는 것으로 보입니다 예를 들어 sprintf(c(10,1), fmt = '%#.1f')그 성가신 선행 공간을 제거하고 반환합니다 "10.0" "1.0".
Nicholas G Reich

1
선행 공백은 결과 format가 열에 사용될 때 소수점을 정렬하도록 설계된 기능입니다 .
주민

34

원하는 x소수점 이하 자릿수를 지정할 수 있습니다. 여기에 x많은 소수 자릿수 숫자입니다. 이 숫자의 소수점 이하 자릿수를 최대 8 자리까지 표시한다고 가정합니다.

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

여기 format="f"에 일반적인 소수점 이하 자릿수 xxx.xxx의 부동 숫자가 표시되고 자릿수가 digits지정됩니다. 반대로, 정수를 표시하려면 format="d"(와 같이 sprintf) 사용하십시오.


OP가 무엇을 요구했는지 정확히 알지 못하지만 가장 높은 등급의 답변으로 판단 할 수 formatC는 없지만 거의 독점적 으로이 목적으로 사용하는 것을 관찰 할 수는 없었습니다 . 나는이 답변이 좋고 OP의 요청에 따라 기본 R에 있다고 생각합니다.
AdamO

너희들 중 누구 라도이 일을 도울 수 있습니까? stackoverflow.com/q/53279593/5224236
gpier

24

내 패키지 formattable을 사용해 볼 수 있습니다 .

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

좋은 점은 x여전히 숫자 형 벡터이며 동일한 서식으로 더 많은 계산을 수행 할 수 있습니다.

> x + 1
[1] 2.13

더 나은, 숫자가 손실되지 않습니다, 당신은 언제든지 더 많은 숫자로 다시 포맷 할 수 있습니다 :)

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

아침 내내 나를 괴롭히는 그런 작은 작은 찌름. 어떤 이유로 R은 일부 열에 대해서만 표시를 반올림합니다. 해당 열에 대해서도 계산을 수행해야했기 때문에이 수정이 필요했습니다. 작동합니다. 감사 !
thethakuri

나는 baseR 함수보다 형식을 좋아한다. 가장 큰 장점은 변수를 숫자로 유지합니다.
나사로 서 스턴

22

후행 0을 유지한다고 가정하고 소수점 이하 2 자리

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

어느 것이

[1] "5.50"

@mpag가 아래에 언급했듯이 R은 때때로 이것으로 예기치 않은 값을 줄 수 있고 둥근 방법, 예를 들어 sprintf (5.5550, fmt = '% #. 2f')는 5.56이 아닌 5.55를 나타냅니다.


1
그러나 sprintf가 둥글지만 sprintf (5.5550, fmt = '% #. 2f')는 약간 예기치 않은 결과를 제공합니다. 5.55. sprintf (5.555000000001, fmt = '% #. 2f')는 5.56을 제공합니다. round, nsmall 방법이 동일한 것처럼 R에서 반올림하는 일반적인 "문제"인 것 같습니다.
mpag

@mpag 덕분에 R이 경계에서 반올림으로 어려움을 겪고 있다는 것을 몰랐습니다 .5.565로 반올림했지만 5.545로 내림했습니다. 부동 소수점 정밀도를 처리하는 방식이라고 생각합니다. 나는 다른 언어로이 동작을 본 적이 없다고 생각한다. 그것들은 그것들이 내장 된 해결 방법을 가지고 있다는 것을 의미한다고 생각한다
Mark Adamson

오히려 그들은 의도적으로 값을 정밀도의 한계로 취급한다고 생각합니다. 그들은 5.555라는 값이 5.5546의 "실제"값 5.55.5에서 나온 것 같다고 생각합니다. 그러나 이런 종류의 반올림 게임을 계속하면 5.444445가 한 번에 한 자리 씩만하면 "6"으로 끝날 수 있습니다. 그러나 이진 표현이 5.55 이하 또는 약간 이상인 것이 문제 일 수 있습니다.
mpag

그래, 의도적이라면 5.565와 5.545 사이에서도 일관성이 있다고 생각합니다. '임의성'은 그것이 부동 소수점 표현이라고 제안합니다.
Mark Adamson

너희들 중 누구 라도이 일을 도울 수 있습니까? stackoverflow.com/q/53279593/5224236
gpier

8

그런 것 :

options(digits=2)

숫자 정의 옵션 :

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

스크립트를 실행할 때 이것을 동적으로 설정하는 방법이 있습니까?
Brandon Bertelsen

이것은 R 콘솔 내에서 출력하기 위해 작동하지만 내 스크립트 내에서 작동하지 않습니다 (그들은 여전히 ​​.1289273982와 함께 나옵니다)
Brandon Bertelsen

1
이상한 동작이 발생합니다.이 digits옵션은 소수점 이하 자릿수를 설정하지 않는 것 같습니다. 예를 들어 옵션 (숫자 = 2)을 설정하면 7.25를 인쇄하면 7.2가 출력되고 1234.25는 1234가되고 0.25는 0.25로 유지됩니다. 이것과 상호 작용하는 다른 옵션이 있습니까?
Maxim.K

8

기능 prettyNum, 형식 확인

시험 시행 제로 (예 : 123.1240) 사용 sprintf(x, fmt='%#.4g')


@ 42 학습을 옹호하고 싶습니다. sprintf기본적으로 형식을위한 프레임 워크입니다.
jangorecki

1
@jangorecki 나는 당신의 요점을 잘 모르겠습니다. 내가 한 (5 년 이상 전에) 한 철자 수정 제안이었습니다.
IRTFM

@ 42 나는 당신이 fmtarg 에 대해 불평하는 것을 미안합니다!
jangorecki

OP는 고정 자릿수가 아닌 고정 소수점 이하에 있다고 생각합니다. g귀하의 답변에는 고정 숫자에 대한 것 같습니다 f.
Mark Adamson

5

고정 숫자보다 유효 숫자를 선호하는 경우 signif 명령이 유용 할 수 있습니다.

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

1
고마워 폴 이 두 가지는 내가 정확히 찾고있는 것이 아니지만 signif가 나를 원했던 round ()로 이끌었습니다. 건배
Brandon Bertelsen

34
Error: could not find function "fixed"
ThomasH

signif제공된 특정 숫자에 대해서는 작동하지만 일반적으로 적용되는 문제는 소수점 이하 두 자리를 정확히 표시해야하지만 숫자가 무엇인지 미리 알 수 없을 때입니다. 이 경우 signif실제 숫자에 따라 다른 소수 자릿수를 제공합니다.
Jeromy Anglim

3
고정 된 곳은 어디에도 없습니다. 그렇지 않으면이 잘못된 답변을 삭제해야합니다.
HelloWorld

@JeromyAnglim 3sf를 원할 때 어떻게 수정합니까? 때로는 3sf, 다른 시간에는 4sf 등을 제공합니다. 어떻게 수정합니까?
christouandr7

4

이 함수 formatC()를 사용하여 숫자를 소수점 이하 두 자리로 서식을 지정할 수 있습니다. 결과 값에 후행 0이 포함 된 경우에도이 함수는 소수점 이하 두 자리를 제공합니다.


3

강제 변형 K 소수점 이하 자릿수에이 변형을 사용하고 있습니다.

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

2

R의 숫자 객체는 배정 밀도 로 저장되므로 소수점 이하 16 진수의 정밀도를 얻을 수 있습니다. 나머지는 노이즈입니다. 위에 표시된 숫자는 단지 예일 뿐이지 만 길이는 22 자리입니다.


3
확인 된 것은 단지 예일뿐입니다. 나는 키보드를 으깨었다.
Brandon Bertelsen

1

나처럼 보일 것 같아

library(tutoR)
format(1.128347132904321674821, 2)

약간의 온라인 도움말 당 .


나는 이것을 찾았지만 패키지가 필요합니다. 기본 패키지 내에서 무언가를 찾고 있습니다.
Brandon Bertelsen

2
@brandon, format ()은 기본의 일부입니다. R을 열고? format ...을 입력하십시오. 패키지가 필요 없습니다.
JD Long

흠,이 결과물을 보았습니까? [1] "1.128347"그렇지 않으면 기본 패키지에 있다는 것이 옳습니다.
Brandon Bertelsen 1

1
format.default(x, digits = 2)제공된 링크를 기반으로 어두운 곳에서 촬영을 시도했을 수 있습니다. 그 정보는 내가 문서를 위해 일반적으로 읽는 것에서 부족한 것입니다. 인쇄 된 출력도 볼 것으로 기대했습니다.
Tim Meers

귀하의 링크가 기본의 일부가 아닌 tutoR 문서를 가리키는 것으로 나타났습니다.
브랜든 베르 텔슨

1

숫자 또는 목록을 반올림하려면 간단히

round(data, 2)

그런 다음 데이터는 소수점 이하 2 자리로 반올림됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.