2017-03-27 3 views
2

signif() 함수는 주어진 값의 유효 숫자를 기준으로 값을 반올림합니다. 이 함수는 숫자의 자릿수 모두에 적용됩니다. 따라서 크기의 서로 다른 주문 수가 반올림되고 다르게 절단됩니다. 예를 들어,이 벡터 x ...숫자의 소수부가있는 유효 숫자로 반올림 *

x <- c(100.1303421, 10.03421, 1.3421, 0.0003421) 
lapply(x, signif, 2) 
#> [[1]] 
#> [1] 100 
#> 
#> [[2]] 
#> [1] 10 
#> 
#> [[3]] 
#> [1] 1.3 
#> 
#> [[4]] 
#> [1] 0.00034 

으로 ... 제 1 및 제 2 값 (100) 및 (10)에 절단이고 세 번째와 네 번째 값 (상이한 수 있지만) 소수 유지하면서 진수 값은 사라진다. 이것은 signif()의 예상 출력입니다. 이 중요한 것으로 결정될 때 모든 숫자를 고려해야합니다.

각 숫자의 정수 부분을 무시하고 설정된 유효 자릿수가있는 소수 부분 만 포맷 할 수 있습니까? 이 값을 반환 할 수있는 이되고 싶습니다. c(100.13, 10.034, 1.34, 0.00034); 그 은 . 앞에 오는 완전한 정수 다음에 숫자의 소수 부분 인 유효 숫자 인 이옵니다.

지금, 나는 정수 일부 구성 요소에 값을 분리 만 일부 구성 요소, 에 signif()를 실행하지만, 이것은 매우 해키 보인다 함수를 만들었습니다.

signif_ignore_integer <- function(x, digits = 2) { 
    as.integer(x) + signif(x - as.integer(x), digits) 
} 

lapply(x, signif_ignore_integer, 2) 
#> [[1]] 
#> [1] 100.13 
#> 
#> [[2]] 
#> [1] 10.034 
#> 
#> [[3]] 
#> [1] 1.34 
#> 
#> [[4]] 
#> [1] 0.00034 

는 정수 부분을 무시하면서 중요한 숫자 주어진 숫자 값을 반올림하는 (아마도 일부 공상 sprintf() 형식) 더 나은, 더 권장 방법이 있나요?

+3

더있을 수 있습니다 하지만, 당신의 접근 방식이 비합리적으로 보이지는 않습니다. 그러나 당신은'floor'를 사용하고'lapply'를 피하기 위해 벡터화를 이용함으로써 그것을 능률화 할 수 있습니다 : my_signif = function (x, digits) floor (x) + signif (x-floor (x), digits); my_signif (x, 2)' – eipi10

+0

오 우수합니다. 이것이 부당하지 않다는 것을 안심시켜줍니다. – Andrew

+0

나는 대답으로 게시 한 더욱 간소화 된 접근 방식이 있다는 것을 깨달았습니다. @Ryan이 방금 (지금 삭제 된) 주석에 게시했습니다. – eipi10

답변

1

더 나은 방법이있을 수 있지만 일반적인 접근 방식은 불합리한 것처럼 보이지 않습니다. 그러나 각 숫자의 소수 부분을 반환 lapply을 피하기 위해 벡터화를 활용, floor를 사용하고, 모드 연산자를 사용하여 간소화 할 수 있습니다

my_signif = function(x, digits) floor(x) + signif(x %% 1, digits) 

my_signif(x, 2) 
[1] 100.13000 10.03400 1.34000 0.00034 
+0

속도는 아마 여기서 문제가되지는 않을 것이라고 생각하지만,'trunc'는'floor'보다 조금 빠릅니다. – Ryan

+0

귀하의 의견을 반영하도록 업데이트했습니다. 감사! – eipi10

+0

'trunc()'이 음수로 나뉘는 것처럼 보입니다 :'my_signif (-10.03421, 2)'= -9.03. 이것을'floor()'로 바꾸면 -10.03의 올바른 결과가 나온다. – Andrew

관련 문제