programing

R에서 숫자를 백분율로 포맷하는 방법은 무엇입니까?

subpage 2023. 6. 28. 21:44
반응형

R에서 숫자를 백분율로 포맷하는 방법은 무엇입니까?

R의 새로운 사용자로서 저를 당황하게 했던 것 중 하나는 숫자를 인쇄를 위한 백분율로 포맷하는 방법이었습니다.

예: 표시0.12345~하듯이12.345%이 문제에 대한 여러 가지 해결 방법이 있지만, 이 중 "새로운 친화력"은 없는 것 같습니다.예:

set.seed(1)
m <- runif(5)

paste(round(100*m, 2), "%", sep="")
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"

sprintf("%1.2f%%", 100*m)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"

질문:이를 위한 기본 R 기능이 있습니까?또는 편리한 포장지를 제공하는 널리 사용되는 패키지가 있습니까?


이와 같은 것을 찾고 있음에도 불구하고.?format,?formatC그리고.?prettyNum저는 아직 R 베이스에서 적당한 편리한 포장지를 찾지 못했습니다.??"percent"유용한 것을 얻지 못했습니다. library(sos); findFn("format percent")1250개의 히트를 반환합니다. 다시 말해 유용하지 않습니다. ggplot2기능이 있습니다.percent하지만 이것은 반올림 정확도를 제어할 수 없습니다.

나중에도:

@DzimitryM이 지적한 바와 같이,percent()을 위해 "보류"되어 왔습니다.label_percent()옛것과 동의어인.percent_format()기능.

label_percent()함수를 반환하므로 이 함수를 사용하려면 추가 괄호 쌍이 필요합니다.

library(scales)
x <- c(-1, 0, 0.1, 0.555555, 1, 100)
label_percent()(x)
## [1] "-100%"   "0%"      "10%"     "56%"     "100%"    "10 000%"

첫 번째 괄호 집합 안에 인수를 추가하여 사용자 지정합니다.

label_percent(big.mark = ",", suffix = " percent")(x)
## [1] "-100 percent"   "0 percent"      "10 percent"    
## [4] "56 percent"     "100 percent"    "10,000 percent"

몇 년 후 업데이트:

요즘 krlmlr의 답변에 나와 있는 것처럼 패키지에 기능이 있습니다.제 손으로 말아서 쓰는 용액 대신에 그것을 사용하세요.


다음과 같은 것을 시도해 보십시오.

percent <- function(x, digits = 2, format = "f", ...) {
  paste0(formatC(100 * x, format = format, digits = digits, ...), "%")
}

예를 들어,

x <- c(-1, 0, 0.1, 0.555555, 1, 100)
percent(x)

(원하는 경우 형식을 다음에서"f"로."g".)

패키지를 확인합니다.그것은 한때의 일부였습니다.ggplot2,생각합니다.

library('scales')
percent((1:10) / 100)
#  [1] "1%"  "2%"  "3%"  "4%"  "5%"  "6%"  "7%"  "8%"  "9%"  "10%"

정밀도를 감지하기 위한 내장 로직은 대부분의 경우에 충분히 잘 작동합니다.

percent((1:10) / 1000)
#  [1] "0.1%" "0.2%" "0.3%" "0.4%" "0.5%" "0.6%" "0.7%" "0.8%" "0.9%" "1.0%"
percent((1:10) / 100000)
#  [1] "0.001%" "0.002%" "0.003%" "0.004%" "0.005%" "0.006%" "0.007%" "0.008%"
#  [9] "0.009%" "0.010%"
percent(sqrt(seq(0, 1, by=0.1)))
#  [1] "0%"   "32%"  "45%"  "55%"  "63%"  "71%"  "77%"  "84%"  "89%"  "95%" 
# [11] "100%"
percent(seq(0, 0.1, by=0.01) ** 2)
#  [1] "0.00%" "0.01%" "0.04%" "0.09%" "0.16%" "0.25%" "0.36%" "0.49%" "0.64%"
# [10] "0.81%" "1.00%"

다음을 확인하십시오.percent의 기능formattable패키지:

library(formattable)
x <- c(0.23, 0.95, 0.3)
percent(x)
[1] 23.00% 95.00% 30.00%

기준 R

나는 사용하는 것을 훨씬 선호합니다.sprintf기본 R에서 사용할 수 있습니다.

sprintf("%0.1f%%", .7293827 * 100)
[1] "72.9%"

특히 좋아합니다.sprintf문자열을 삽입할 수도 있기 때문입니다.

sprintf("People who prefer %s over %s: %0.4f%%", 
        "Coke Classic", 
        "New Coke",
        .999999 * 100)
[1] "People who prefer Coke Classic over New Coke: 99.9999%"

특히 유용합니다.sprintf데이터베이스 구성과 같은 것으로; 당신은 그저 yaml 파일에서 읽은 다음, sprintf를 사용하여 많은 불쾌한 것 없이 템플릿을 채웁니다.paste0

긴 동기 부여 예제

이 패턴은 텍스트가 많고 집계할 값이 많은 rmarkdown 보고서에 특히 유용합니다.

설정/집계:

library(data.table) ## for aggregate

approval <- data.table(year = trunc(time(presidents)), 
                       pct = as.numeric(presidents) / 100,
                       president = c(rep("Truman", 32),
                                     rep("Eisenhower", 32),
                                     rep("Kennedy", 12),
                                     rep("Johnson", 20),
                                     rep("Nixon", 24)))
approval_agg <- approval[i = TRUE,
                         j = .(ave_approval = mean(pct, na.rm=T)), 
                         by = president]
approval_agg
#     president ave_approval
# 1:     Truman    0.4700000
# 2: Eisenhower    0.6484375
# 3:    Kennedy    0.7075000
# 4:    Johnson    0.5550000
# 5:      Nixon    0.4859091

사용.sprintf텍스트와 숫자의 벡터를 사용하여 출력cat새로운 라인을 위해서요.

approval_agg[, sprintf("%s approval rating: %0.1f%%",
                       president,
                       ave_approval * 100)] %>% 
  cat(., sep = "\n")
# 
# Truman approval rating: 47.0%
# Eisenhower approval rating: 64.8%
# Kennedy approval rating: 70.8%
# Johnson approval rating: 55.5%
# Nixon approval rating: 48.6%

마지막으로, 제 이기적인 참고로, 우리가 포맷에 대해 이야기하고 있기 때문에, 저는 기본 R로 쉼표를 찍는 방법으로 쉼표를 찍습니다.

30298.78 %>% round %>% prettyNum(big.mark = ",")
[1] "30,299"

저는 이 답변들에 대해 속도에 대한 벤치마킹을 몇 가지 했는데, 이를 보고 놀랐습니다.percent에 시대에scales부진을 감안할 때, 그렇게 선전된 패키지.적절한 포맷을 위한 자동 감지기가 장점이라고 생각합니다. 하지만 데이터가 어떤 것처럼 보이는지 안다면 데이터를 피하는 것이 분명해 보입니다.

다음은 (0,1)의 100,000 퍼센트 목록의 형식을 2자리의 백분율로 지정하려고 시도한 결과입니다.

library(microbenchmark)
x = runif(1e5)
microbenchmark(times = 100L, andrie1(), andrie2(), richie(), krlmlr())
# Unit: milliseconds
#   expr       min        lq      mean    median        uq       max
# 1 andrie1()  91.08811  95.51952  99.54368  97.39548 102.75665 126.54918 #paste(round())
# 2 andrie2()  43.75678  45.56284  49.20919  47.42042  51.23483  69.10444 #sprintf()
# 3  richie()  79.35606  82.30379  87.29905  84.47743  90.38425 112.22889 #paste(formatC())
# 4  krlmlr() 243.19699 267.74435 304.16202 280.28878 311.41978 534.55904 #scales::percent()

그렇게sprintf우리가 퍼센트 기호를 추가하고 싶을 때 확실한 승자로 등장합니다.반올림, 반에면, 만우가숫반만올자림 (% 와비퍼서로 이동트센싶에면다을율고곱하없리이약%만▁on▁without,▁then(▁if",싶면다▁the을▁(▁wego▁and곱하고▁want▁only▁number▁round▁multiply▁from▁to)▁"%,▁the,),round()가장 빠름:

# Unit: milliseconds
#        expr      min        lq      mean    median        uq       max
# 1 andrie1()  4.43576  4.514349  4.583014  4.547911  4.640199  4.939159 # round()
# 2 andrie2() 42.26545 42.462963 43.229595 42.960719 43.642912 47.344517 # sprintf()
# 3  richie() 64.99420 65.872592 67.480730 66.731730 67.950658 96.722691 # formatC()

tidyverse버전:

> library(dplyr)
> library(scales)

> set.seed(1)
> m <- runif(5)
> dt <- as.data.frame(m)

> dt %>% mutate(perc=percent(m,accuracy=0.001))
          m    perc
1 0.2655087 26.551%
2 0.3721239 37.212%
3 0.5728534 57.285%
4 0.9082078 90.821%
5 0.2016819 20.168%

평소처럼 깔끔해 보입니다.

이 작업에만 스케일 패키지를 사용할 수 있습니다(필수 또는 라이브러리와 함께 로드하지 않음)

scales::percent(m)

다음은 새로운 기능을 정의하기 위한 저의 솔루션입니다(주로 저는 카레와 작곡을 가지고 놀 수 있습니다 :-).

library(roxygen)
printpct <- Compose(function(x) x*100, Curry(sprintf,fmt="%1.2f%%"))
try this~

data_format <- function(data,digit=2,type='%'){
if(type=='d') {
    type = 'f';
    digit = 0;
}
switch(type,
    '%' = {format <- paste("%.", digit, "f%", type, sep='');num <- 100},
    'f' = {format <- paste("%.", digit, type, sep='');num <- 1},
    cat(type, "is not a recognized type\n")
)
sprintf(format, num * data)
}

이 함수는 데이터를 열별 백분율로 변환할 수 있습니다.

percent.colmns = function(base, columnas = 1:ncol(base), filas = 1:nrow(base)){
    base2 = base
    for(j in columnas){
        suma.c = sum(base[,j])
        for(i in filas){
            base2[i,j] = base[i,j]*100/suma.c
        }
    }
    return(base2)
}

언급URL : https://stackoverflow.com/questions/7145826/how-to-format-a-number-as-percentage-in-r

반응형