programing

소수 자릿수 형식 지정(R)

batch 2023. 6. 5. 23:45
반응형

소수 자릿수 형식 지정(R)

예를 들어 1.128347132904321674821과 같이 화면에 출력할 때 소수점 두 자리만 표시하고 싶은 숫자가 있습니다.사람이 어떻게 그걸 하니?

x <- 1.128347132904321674821

편집:

용도:

options(digits=2)

가능한 답변으로 제안되었습니다.스크립트 내에서 이것을 일회성 사용으로 지정할 수 있는 방법이 있습니까?스크립트에 추가하면 다른 기능은 없는 것 같고 각 번호를 포맷하기 위해 재입력하는 것에는 관심이 없습니다(매우 큰 보고서를 자동화하고 있습니다).

--

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

배경:이 페이지에서 제안된 몇 가지 답변(예: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"

대안 논의:

C 응답 형식과 sprintf 응답 형식은 매우 잘 작동합니다.하지만 원치 않을 수도 있는 경우에는 마이너스 0을 보일 것입니다.예.,

formatC(c(-0.001), digits = 2, format = "f")
# [1] "-0.00"
sprintf(-0.001, fmt = '%#.2f')
# [1] "-0.00"

이 문제를 해결할 수 있는 방법은 다음과 같습니다.

formatC(as.numeric(as.character(round(-.001, 2))), digits = 2, format = "f")
# [1] "0.00" 

다음과 같이 숫자 형식을 지정할 수 있습니다.x원하는 소수점 이하까지.여기서x소수 자릿수가 많은 숫자입니다. 이하 해 보겠습니다.

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

여기서format="f"는 일반적인 소수점 이하의 부동 숫자를 제공합니다. 예를 들어, xxx.xxx 및digits자릿수를 지정합니다.대조적으로, 표시할 정수를 얻으려면 다음을 사용합니다.format="d"((으)로 표시됨sprintf).

당신은 제 패키지를 테이블로 사용해 볼 수 있습니다.

> # 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

소수점 이하 두 자리에 대해 0의 뒤를 계속 이어야 한다고 가정합니다.

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

이는

[1] "5.50"

@mpag가 아래에서 언급했듯이, R은 때때로 이 값으로 예상치 못한 값을 제공할 수 있으며 라운드 방법(예: sprintf(5.5550, fmt='%#.2f')은 5.56이 아닌 5.55를 제공합니다.

비슷한 것:

options(digits=2)

자릿수 정의 옵션:

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

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

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

함수 확인 prettyNum, 형식

시행 0이 있는 경우(예: 123.1240) 사용sprintf(x, fmt='%#.4g')

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

이 변형을 K 소수점 인쇄에 사용합니다.

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

R의 숫자 객체는 두 배의 정밀도로 저장되므로 (약 16자리의) 정밀도를 얻을 수 있습니다. 나머지는 노이즈입니다.위에 표시된 숫자는 아마도 예시일 것이지만, 22자리 길이라는 것을 인정합니다.

내가 보기엔 뭔가가 되고 싶은 것 같습니다.

library(tutoR)
format(1.128347132904321674821, 2)

약간의 온라인 도움말에 따라.

만약 당신이 단지 숫자나 목록을 반올림하고 싶다면, 그냥 사용하세요.

round(data, 2)

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

저는 개선될 수 있지만 코너 케이스에서 잘 작동하는 것처럼 보이는 이 기능을 썼습니다.예를 들어, 0.9995의 경우, 정답 투표는 1.00을 제공하는데, 이는 잘못된 것입니다.저는 숫자에 소수가 없을 경우에 그 솔루션을 사용합니다.

round_correct <- function(x, digits, chars = TRUE) {
  if(grepl(x = x, pattern = "\\.")) {
    y <- as.character(x)
    pos <- grep(unlist(strsplit(x = y, split = "")), pattern = "\\.", value = FALSE)
    if(chars) {
      return(substr(x = x, start = 1, stop = pos + digits))
    }
    return(
      as.numeric(substr(x = x, start = 1, stop = pos + digits))
    )
  } else {
    return(
      format(round(x, 2), nsmall = 2)
    )
  }
}

예:

round_correct(10.59648, digits = 2)
[1] "10.59"
round_correct(0.9995, digits = 2)
[1] "0.99"
round_correct(10, digits = 2)
[1] "10.00"
library(dplyr)
# round the numbers
df <- df %>%
  mutate(across(where(is.numeric), .fns = function(x) {format(round(x, 2), nsmall = 2)}))

여기서는 모든 숫자 값을 소수점 두 자리만 갖도록 변경합니다.소수점 이하로 변경해야 하는 경우

# round the numbers for k decimal places
df <- df %>%
  mutate(across(where(is.numeric), .fns = function(x) {format(round(x, k), nsmall = k)}))

k를 원하는 소수 자릿수로 바꿉니다.

다음은 단위에서 백만 단위까지 접근하는 방법입니다. digits 매개 변수를 사용하여 유효한 최소 값 수(숫자 + 소수)를 조정할 수 있습니다.먼저 안쪽의 소수점 반올림을 조정할 수 있습니다.

number <-function(number){
  result <- if_else(
    abs(number) < 1000000,
    format(
      number, digits = 3,
      big.mark = ".",
      decimal.mark = ","
    ),
    paste0(
      format(
        number/1000000,
        digits = 3,
        drop0trailing = TRUE,
        big.mark = ".",
        decimal.mark = ","
      ),
      "MM"
    )
  )
  # result <- paste0("$", result)
  return(result)
}

언급URL : https://stackoverflow.com/questions/3443687/formatting-decimal-places-in-r

반응형