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
기능이 scales
있습니다. 내 수동 솔루션 대신 사용하십시오.
같은 것을 시도하십시오
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"
.
답변
scales
패키지를 확인하십시오 . 그것은 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%
답변
좀이 답변에 속도를 벤치마킹 및보고 놀랐다했다 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
퍼센트 부호를 추가 할 때 확실한 승자로 나타납니다. 반면에 숫자와 반올림 만 늘리려면 “%”없이 비율에서 퍼센트로 이동하면 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()
답변
이 작업에 대해서만 스케일 패키지를 사용할 수 있습니다 (요청 또는 라이브러리로로드하지 않고).
scales::percent(m)
답변
다음은 새로운 기능을 정의하는 솔루션입니다 (주로 Curry 및 Compose 🙂 사용할 수 있습니다).
library(roxygen)
printpct <- Compose(function(x) x*100, Curry(sprintf,fmt="%1.2f%%"))
답변
어떻게 보면 scalable::percent
이미 느린과 릴리아나 파 체코는 다른 솔루션을 제공을 것으로 표시했다, 내가 나서서 예 마이클 세트를 기반으로 몇 가지 다른 옵션에 대한 벤치 마크를 시도한 :
library(microbenchmark)
library(scales)
library(formattable)
x<-runif(1e5)
lilip <- function() formattable::percent(x,2)
krlmlr <- function() scales::percent(x)
andrie1 <- function() paste0(round(x,4) * 100, '%')
microbenchmark(times=100L,lilip(), krlmlr(), andrie1())
내가 얻은 결과는 다음과 같습니다.
Unit: microseconds
expr min lq mean median uq max neval
lilip() 194.562 373.7335 772.5663 889.7045 950.4035 1611.537 100
krlmlr() 226270.845 237985.6560 260194.9269 251581.0235 280704.2320 373022.180 100
andrie1() 87916.021 90437.4820 92791.8923 92636.8420 94448.7040 102543.252 100
그래도 난, 아무 생각이 없다, 왜 내 krlmlr()
와 andrie1()
너무 MichaelChirico의 예에서보다 훨씬 더 수행. 단서가 있습니까?