2012-03-09 8 views
0

몇 달 전에 원래 입력 데이터로 작업 한 하위 명령문이 생겼습니다. 그 이후로 나는 추악한 과정을 다시 검사하도록 일하는 것을 멈췄습니다. 나는 그것을 공유하고 싫어하지만, 한 번에 여러 가지 일을 수행 :'sub'로 대체하거나 일치하지 않음

active$id[grep("CIR",active$description)] <- sub(".*CIR0*(\\d+).*","\\1",active$description[grep("CIR",active$description)],perl=TRUE) 

이 문장은 설명 열에 포함 된 ID를 가지고 행을 찾아 새로운 id 컬럼을 만들었습니다. 하위 명령문은 "CIR0"다음에 오는 번호를 찾고 행 설명 내에 ID가있는 경우 id 열을 채 웁니다. 할당의 어느 한쪽을 부분 집합하는 임베디드 grep로 비효율적이라는 것을 알고 있습니다.

패턴이 일치하지 않으면 '하위'대체 값을 없거나 비워 둘 수있는 방법이 있습니까? 매우을 놓치고있는 것처럼 느껴지지만 커뮤니티의 도움을 요청하십시오. 고맙습니다. 당신이이 있는지 즉,

active$id[grep("CIR",active$description)] <- ifelse(match, replacement, "") 

match이 true로 평가해야하는 위치, ifelse() 사용하여 시도 할 수

| name | id | description  | 
|------+-----+-------------------| 
| a | 343 | Here is CIR00343 | 
| b |  | Didn't have it | 
| c | 123 | What is CIR| 
| d |  | CIR lacks a digit | 
| e | 452 | CIR452 is next | 
+2

일부 샘플 데이터를 출력하면 좋을 것입니다. 그렇게하면 필요한 것을 확인할 수 있습니다. – nograpes

+0

나는 샘플 데이터가 더 혼란스러워 할지도 모르지만 당신이 옳다는 것에 대한 질문이 일반화되었다고 스스로 확신했다. 나는 짧은 표를 추가했다. – jed

답변

1

나는 몇 주 전에 같은 문제로 어려움을 겪고있었습니다. 나는 stringr 패키지에서 str_match 함수를 사용하여 끝냈다. 대상 문자열이 없으면 NA를 반환합니다. 결과를 정확히 부분 집합했는지 확인하십시오. 예 :

library(stringr) 
str = "Little_Red_Riding_Hood" 
sub(".*(Little).*","\\1",str) # Returns 'Little' 
sub(".*(Big).*","\\1",str) # Returns 'Little_Red_Riding_Hood' 
str_match(str,".*(Little).*")[1,2] #Returns 'Little' 
str_match(str,".*(Big).*")[1,2] # Returns NA 
+0

나를 stringr 패키지에 소개해 주셔서 감사합니다. 그것을 사용하여 프로세스를 정리하고 예상치 못한 사이드 케이스를 캡처 할 수있었습니다. – jed

0

나는이 경우 생각 : id를 열을 생성하는 결과

예 일치하고, replacement은 그 경우에 그 요소가 대체 될 것입니다. 마찬가지로 match이 false로 평가되면 해당 요소는 빈 문자열 (또는 원하는 경우 NA)로 바뀝니다.

+0

면책 조항 : 나는 R에서 grep/regex 기능을 많이 사용하지 않았기 때문에 이것이 최선의 해결책은 아닐지 모르겠다. 그러나 나는 단지 그것을 버리고있다. - ifelse() 내가 잃어버린 상황이 중요합니다. –

+0

감사합니다.이 경우 ifelse()를 고려하지 않았지만 대답 한 후에이를 활용하는 방법을 찾으려했습니다. 교체 작업의 일부로 프로세스를 복제하지 않고 테스트에서 패턴을 캡처하는 데 어려움이 있습니다. 좀 더 생각해 볼게. – jed

관련 문제