code

인쇄 출력의 10진수(R) 수 제어

starcafe 2023. 6. 17. 09:32
반응형

인쇄 출력의 10진수(R) 수 제어

R에는 숫자 표시를 제어하는 옵션이 있습니다.예:

options(digits=10)

R 세션이 끝날 때까지 계산 결과를 10자리로 제공해야 합니다.R의 도움말 파일에서 digits 파라미터의 정의는 다음과 같습니다.

digits: 숫자 값을 인쇄할 때 인쇄할 자릿수를 제어합니다.그것은 단지 제안일 뿐입니다.유효한 은 1...22(기본값 7)

그래서, 이것은 단지 제안일 뿐입니다.더 많거나 덜하지 않고 항상 10자리를 표시하려면 어떻게 해야 합니까?

두 번째 질문은 22자리 이상을 표시하려면 어떻게 해야 합니까? 즉, 100자리와 같은 보다 정확한 계산을 위해?Base R로 가능한가요, 아니면 추가 패키지/기능이 필요한가요?

편집 : jmoy의 제안 덕분에 노력했습니다.sprintf("%.100f",pi)그리고 그것은 주었습니다.

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

소수점 48자리입니다.이것이 R이 처리할 수 있는 최대 한도입니까?

이것이 단지 제안일 뿐인 이유는 옵션 값을 무시한 인쇄 함수를 쉽게 작성할 수 있기 때문입니다. 및 은 내된인포기은을 합니다.options값을 기본값으로 지정합니다.

두 번째 질문은 R이 유한 정밀도 산술을 사용하기 때문에 소수점 이하 15~16자리 이상으로 정확하지 않기 때문에 일반적으로 더 많은 것이 필요하지 않습니다.gmprcdd 패키지는 (gmp 라이브러리에 대한 인터페이스를 통해) 여러 정밀 산술을 처리하지만, 이는 대부분 2배에 대한 소수점 이상보다는 큰 정수와 관련이 있습니다.

Mathematica나 Maple은 여러분의 심장이 원하는 만큼 소수점을 줄 수 있게 해줄 것입니다.


소수점과 유의한 숫자 사이의 차이에 대해 생각해 보는 것이 유용할 수 있습니다.유의한 15번째 수치를 초과하는 차이에 의존하는 통계 검정을 수행하는 경우 분석은 거의 확실하게 정크가 됩니다.

은 반에만, , 숫숫을은자약작, 다수룰문다덜있니, 을들입제때그것은에기문면자은루들고은우지이신▁as▁small▁on▁as▁number,▁r▁handle▁r▁can▁numbers,다▁of▁problem▁if▁since▁small▁you▁is문▁with니와 같은 작은 숫자를 다룰 수 있기 때문에 문제가 덜합니다..Machine$double.xmin(일반적으로 2e-308).

이 두 분석을 비교합니다.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

첫 번째 경우 숫자 간의 차이는 유의한 숫자가 많이 나온 후에만 발생하므로 데이터는 "거의 일정"합니다.두 번째 경우에는 숫자 자체의 크기에 비해 숫자 간 차이의 크기는 동일하지만 크기가 큽니다.


e3bo에서 언급한 바와 같이, 다음을 사용하여 다중 정밀 부동 소수점 번호를 사용할 수 있습니다.Rmpfr꾸러미

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

일반 제품보다 사용 속도가 느리고 메모리 집약적입니다(두 배 정밀도).numeric벡터입니다. 그러나 조건이 좋지 않은 문제나 불안정한 알고리즘이 있는 경우 유용할 수 있습니다.

전체 출력을 직접 생산하는 경우 다음을 사용할 수 있습니다.sprintf(),예.

> sprintf("%.10f",0.25)
[1] "0.2500000000"

부동 소수점 숫자를 10개의 소수점으로 형식을 지정합니다(단위:%.10ff플로트와 그를 위한 것입니다..1010개의 소수점을 지정합니다.

저는 R의 상위 레벨 기능이 정확한 숫자를 인쇄하도록 강제하는 방법을 모릅니다.

64비트 더블을 사용하여 얻을 수 있는 최고의 정확도는 십진수 16자리이므로 R의 일반 숫자를 인쇄하는 경우 100자리를 표시하는 것은 의미가 없습니다( 참조).시스템의 시스템 $double.eps)입니다.나머지 숫자들은 그냥 정크일 뿐입니다.

필요에 따라 인쇄할 소수 자릿수를 제어할 수 있는 하나의 솔루션(중복 0을 인쇄하지 않으려는 경우)

예를 들어, 다음과 같은 벡터가 있는 경우elements그리고 받고 싶습니다.sum그 중에서

elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432

보아하니, 마지막 디지털은1잘린 경우, 이상적인 결과는 다음과 같아야 합니다.-876.54321그러나 고정 소수점 인쇄 옵션으로 설정된 경우, 예를 들어sprintf("%.10f", sum(elements))중복 0은 다음과 같이 생성됩니다.-876.5432100000

여기의 자습서에 따라: 여기와 같이 특정 숫자의 소수 자릿수를 식별할 수 있는 경우 십진수를 인쇄합니다.-876.54321인쇄해야 할 10진수가 5개 있습니다. 그러면 매개 변수를 설정할 수 있습니다.format다음과 같이 작동합니다.

decimal_length <- 5
formatC(sum(elements), format = "f", digits = decimal_length)
## -876.54321

변경할 수 있습니다.decimal_length각 시간 쿼리를 기반으로 하여 다양한 10진수 인쇄 요구 사항을 충족할 수 있습니다.

주로 사용하는 경우tibbles, 숫자를 적용하는 기능은 다음과 같습니다.num().

다음은 예입니다.

library(tidyverse)

data <- tribble(
  
~ weight, ~ weight_selfreport,
81.5,81.66969147005445,
72.6,72.59528130671505,
92.9,93.01270417422867,
79.4,79.4010889292196,
94.6,96.64246823956442,
80.2,79.4010889292196,
116.2,113.43012704174228,
95.4,95.73502722323049,
99.5,99.8185117967332
)

data <-
  data %>%
  mutate(across(where(is.numeric), ~ num(., digits = 3)))

data
#> # A tibble: 9 × 2
#>      weight weight_selfreport
#>   <num:.3!>         <num:.3!>
#> 1    81.500            81.670
#> 2    72.600            72.595
#> 3    92.900            93.013
#> 4    79.400            79.401
#> 5    94.600            96.642
#> 6    80.200            79.401
#> 7   116.200           113.430
#> 8    95.400            95.735
#> 9    99.500            99.819

따라서 필요에 따라 반올림 옵션을 다르게 설정할 수도 있습니다.저는 그것이 dfs 인쇄에 매우 도움이 되고 다소 빠른 해결책이라고 생각합니다.

언급URL : https://stackoverflow.com/questions/2287616/controlling-number-of-decimal-digits-in-print-output-in-r

반응형