2014-02-24 2 views
1

숫자 데이터를 14 자리를 초과 할 수없는 다른 프로그래밍 언어로 텍스트 파일로 내보내야합니다. 모든 요소가 쉼표로 분리되어 있어야하는 것은 아니므로이 방법을 사용합니다.R : 과학 표기법의 숫자에서 강요 한 문자 열을 gsub로 대체

gsub은 문자 열로 강제 변환 될 때 숫자 42를 재조정하지 않으며 과학 표기법 옵션 scipen을 충분히 낮게 설정하면 42가 전자 표기법으로 인쇄됩니다.

여기서 scipen=-1042는 E 표기법으로 인쇄됩니다.

x <- 4.2e+1 # The meaning of life 
options(scipen = -10) 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=TRUE) 
[1] "4.2e+01" 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=FALSE) 
[1] "4.2e+01" 

마치 일치를 재조정하지 않는 것과 같습니다. 나는 또한 시도했다,

gsub(pattern=x,replacement=paste(",",x),as.character(x)) 

그러나 운 없음으로.

다음 두 예제에서 은 예상대로 작동하고 4230이 42으로 인쇄되도록 충분히 높습니다.

x <- 4.2e+1 # Still the meaning of life 
options(scipen = 0) 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=TRUE) 
[1] ", 42" 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=FALSE) 
[1] ", 42" 

useBytes 옵션을 보면 알 수 있듯이 도움이되지 않습니다. 누군가 내가 얻을 수없는 것을 말해 줄 수 있습니까?

감사합니다.

답변

0

.+은 사전 정의 된 정규식 문자입니다. 따라서 그들은 문자 그대로 해석되지 않습니다. 패턴에서 이러한 문자를 이스케이프 처리해야합니다 (\\). 그런 다음 작동합니다.

x <- 4.2e+1 # The meaning of life 
options(scipen = -10) 

x_pat <- gsub("(\\+|\\.)", "\\\\\\1", x) 
# [1] "4\\.2e\\+01" 

gsub(x_pat, paste(",", x), x) 
# [1] ", 4.2e+01" 

또 다른 가능성은 인수 fixed = TRUE을 사용하는 것입니다. 이는 패턴 문자열을있는 그대로 일치시킵니다.

gsub(x, paste(",", x), x, fixed = TRUE) 
# [1] ", 4.2e+01" 
관련 문제