2012-09-10 6 views
3

R에서 카운터를 0.05 씩 증가시켜야하는 함수를 작성했습니다. 내가 카운터의 가치를 조건으로 할 때 나는 그 가치가 나타나지 않는다고 말하고있다.10 진수로 증가하는 R이 예상 된 값을 반환하지 않습니다.

예 : - 0

설정 대향 < CNTR

0 cntr;

[1] 0 

0.05 시험에 의해 증가 된 카운터

CNTR < - CNTR + 0.05; cntr; [1]

> cntr == 0.05 
[1] TRUE 

0.05

지금까지 너무 좋아. 그러나 몇 번 반복하면 다음과 같은 결과가 발생합니다.

> cntr <- cntr + 0.05; cntr; 
[1] 0.1 
> cntr == 0.1 
[1] TRUE 
> cntr <- cntr + 0.05; cntr; 
[1] 0.15 
> cntr == 0.15 
[1] FALSE 

무슨 일이 일어나고 있으며, 그 이유는 무엇입니까? cntr에 대해 반환 된 값은 0.15이지만이 값과 같지 않습니까? 추가 조사이 밝혀 :

> cntr < 0.1500000000000001 
[1] TRUE 
> cntr < 0.15000000000000001 
[1] FALSE 

라운드 (CNTR 2) == 0.15 [1]

이 뭔가 오해 또는 AM TRUE 무언가가 I가 보고 있지 않습니까? 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다.

+0

[FAQ 7.31] (http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f)입니다. –

답변

5

isTRUE(all.equal(cntr, x)) (x는 0.1, 0.05 등)을 사용해야합니다. 부동 소수점 반올림 오류로 인해 테스트가 실패했습니다. all.equal은 그 오류까지 동등성을 테스트합니다. 이 부분이 당신을 떠날 수있는 다른 예를 보려면 R Inferno에서 서클 1을 확인하십시오.

+1

왜 isTRUE가 필요합니까? 'all.equal (cntr, x)'만이 당신에게'TRUE' 또는'FALSE'를주지 않을까요? –

+2

@SachaEpskamp :'all.equal'은 'TRUE'가 아닌 메시지를 반환합니다. –

+0

아 그래, 지금은 도움말 페이지에서 볼 수 있는데, 그 이유는 나를 위해 일한 적이 없기 때문입니다. D –

3

다른 접근법은 정수를 사용하고 5만큼 증가시킬 수 있습니다. 증가 된 값을 사용해야 할 때는 100으로 나눕니다.

설명 된 문제는 이진 형식을 사용할 때 컴퓨터 프로그램에 십진수 값이 저장되는 방법 때문입니다. R에만 해당되는 문제는 아닙니다. 이 이유에 대해 자세히 알아보십시오 here

3

넓은 의미에서 R 프로그래밍에 익숙하지 않은 것처럼 보입니다. 왜 내가 카운터를 사용하려고하는지 묻고 싶습니다. 일반적으로 R은 루프, 특히 카운터가있는 루프의 사용을 권장하지 않습니다. 카운터와 함께 루프를 사용하는 경우 코드의 효율성을 향상시키기 위해 함수를 벡터화 할 수 있습니다.

+0

예, 저는 R에 상당히 익숙합니다. 데이터 저장소를 분석해야합니다. 데이터에는 0, 0.05, 0.1, 0.15, ..., 1 값을 갖는 필드가 있습니다. 내가 뭘 하려던 것은 부분 집합 명령을 사용하여 해당 필드가 내 cntr과 같은 곳으로 집합을 반환하는 것입니다. 부분 집합 (originalset, 필드 == 전) - (전 범위) { newset <대한 (기준 = 0.05 = 1, = 0) 서열 - 범위 : < 나는 이런 식으로 뭔가를 시도하여 시작 <부호의 나머지> } 다양한 방법을 통해 온으로 (1시 21분에서 I) { newset <대한 CNTR = 0 - 서브 세트 (originalset 필드 == CNTR) CNTR <- CNTR + 0.05 ... } – DataDog

+0

이미 binned되어있는 경우 그룹 별 처리를 수행하기 위해'by' 함수를 체크하십시오. – TARehman

+0

, 감사합니다! – DataDog

관련 문제