2011-02-08 1 views
3

숫자, 빼기 부호 또는 소수점이 아닌 모든 문자를 문자열에서 제거하고 싶습니다.선택한 문자를 제외한 문자열에서 모두 제거

이상한 문자가 포함 된 read.xls을 사용하여 Excel에서 데이터를 가져 왔습니다. 이 숫자를 숫자로 변환해야합니다. 나는 정규 표현식 너무 익숙하지 않다, 그래서 다음을 수행하는 간단한 방법이 필요합니다 : 이러한 문자 내 데이터의 일부에 출연 한 이유는 누군가가 말해 줄 수있는 경우

excel_coords <- c(" 19.53380Ý°", " 20.02591°", "-155.91059°", "-155.8154°") 
unwanted <- unique(unlist(strsplit(gsub("[0-9]|\\.|-", "", excel_coords), ""))) 
clean_coords <- gsub(do.call("paste", args = c(as.list(unwanted), sep="|")), 
        replacement = "", x = excel_coords) 

> clean_coords 
[1] "19.53380" "20.02591" "-155.91059" "-155.8154" 

보너스 (정도 표지판의 일부 원래 Excel 워크 시트, 다른 것은 아닙니다).

+0

왜 데이터를로드하기 전에 찾기 및 바꾸기를 간단하게 수행 할 수 없습니까? 데이터가 Excel 인 경우 데이터가 소수로 표시되도록하십시오. 또한 이미 효과가있는 솔루션을 얻은 것처럼 보입니다. – blunders

+0

@ blunders : 정규 표현식에 이미 존재했으면하는 바램과 같은 단순한 작업 인 것 같아서 학습 질문의 대상입니다. 또한 Excel 시트에 Excel (숫자가 아닌 텍스트로 표시)이 필요한 사람에게 제공하고 있습니다. –

+2

Y와 A는 인코딩 아티팩트로, UTF8 텍스트가 다른 코드 페이지로 부적절하게 인코딩되어 있습니다. – ocodo

답변

5

짧고 달콤한. G. Grothendieck의 의견에 감사드립니다. http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html 가입일

gsub("[^-.0-9]", "", excel_coords) 

는 "문자 클래스 사이에 둘러싸인 문자 목록 [및] 그 목록에서 하나의 문자와 일치하는 상기리스트의 첫 문자가 캐럿^아니라면 그 모든 문자와 일치 할 때 목록에 없습니다. "

+0

그것은 달콤합니다. 비슷한 것을 시도했지만 실수로 "." 어쩌면 "-"도 탈출해야 할 것입니다. 나는 그렇지 않다. –

+1

@DWin : regex의 도움말 파일에 있습니다. 그럼에도 불구하고 먹기에 힘든 샌드위치. –

+2

힘든? 예. 유능한? 매우. 맛있는, 음, 음, 현명한 사람들이 다를 수 있습니다. 관련 문장이 다음과 같은 것으로 의심됩니다. "대부분의 메타 문자는 문자 클래스 내에서 특별한 의미를 잃습니다." –

1
gsub("(.+)([[:digit:]]+\\.[[:digit:]]+)(.+)", "\\2", excel_coords) 
[1] "9.53380" "0.02591" "5.91059" "5.8154" 
+0

거의하지만, 자릿수와 빼기 표지판. 하지만 지금은 그 아이디어를 얻었습니다. –

+0

'gsub ("(\\ s *) (-? [0-9] + \\. [0-9] +) (. +)", "\\ 2", 엑셀 코드)' –

+0

나는 내가 "-"잃어버린 부분을 볼 수는 있지만, 나는 그 자리를 잃어 버렸다. –

2

strsplit, sapplypaste를 사용하여 오히려 잘못된 것보다 올바른 문자를 인덱싱하여 수행 할 수 있습니다 :

excel_coords <- c(" 19.53380Ý°", " 20.02591°", "-155.91059°", "-155.8154°") 
correct_chars <- c(0:9,"-",".") 
sapply(strsplit(excel_coords,""), 
      function(x)paste(x[x%in%correct_chars],collapse="")) 

[1] "19.53380" "20.02591" "-155.91059" "-155.8154"