2013-03-03 4 views
3

나는 R에 대해 처음 이라며 일반적으로 초보 프로그래머라고 생각한다고 말하며 시작합니다. 그래서 내가하는 일을 알고 있다고 가정하지 마십시오.특정 레코드에 대해서만 행렬 검색하기

필자는 대략 30 만 x 14 크기의 큰 매트릭스를 가지고 있습니다. 본질적으로 15 분짜리 데이터의 20 년 데이터 세트입니다. 그러나 필자는 REC.TYPE이라는 ​​이름의 열에 "SAO"또는 "FL-15"라는 문자열이있는 행만 필요합니다.

대단히 비효율적 인 해결책은 행별로 행렬을 검색하고 REC.TYPE 열을 테스트하여 필자의 기준과 일치하지 않는 행을 삭제하는 것이 었습니다. 기본적으로 ...

j <- 1 
    for (i in 1:nrow(dataset)) { 
     if(dataset$REC.TYPE[j] != "SAO " && dataset$RECTYPE[j] != "FL-15") { 
     dataset <- dataset[-j,] } 
     else { 
     j <- j+1 } 
    } 

내 코드는 시간에 매트릭스의 약 10 %를 얻을보고 모든 행과 감속 후 ... 난 단지 기록을 당겨의보다 효율적인 방법이있을 파악 특히 다른 8 개의 데이터 세트를 위해 이것을 반복해야 할 때 특히 필요합니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

+1

당신이 작은 재현 가능한 예제를 제공하면 귀하의 질문은 훨씬 더 의미있을 것입니다. 지금 우리는'dataset'이 무엇인지 추측해야합니다. 이렇게하면 질문이 훨씬 더 현지화되어 미래의 검색 사용자에게 도움이되지 않습니다. –

+2

* 실제로 당신을 죽이는 것은 당신이 항상 데이터 세트를 다시 쓰고 있다는 사실입니다. 그렇게하지 마! –

답변

4

정규식이 필요합니다. 대소 문자를 구분합니다 (아래에 설명).

귀하의 경우에는
x <- c("ABC", "omgSAOinside", "TRALAsaoLA", "tumtiFL-15", "fl-15", "SAOFL-15") 
grepl("SAO|FL-15", x) 
[1] FALSE TRUE FALSE TRUE FALSE TRUE 

, 난 당신이 게시 코드에서 말할 수

subsao <- grepl("SAO", x = dataset$REC.TYPE) 
subfl <- grepl("FL-15", x = dataset$RECTYPE) 
#mysubset <- subsao & subfl # will return TRUE only if SAO & FL-15 occur in the same line 
mysubset <- subsao | subfl # will return TRUE if either occurs in the same line 
dataset[mysubset, ] 
+0

로마인, 나는 OP의 문제가 더 근본적이라고 생각합니다. 'for' 루프를 사용하는 대신'['을 사용하여 원하는 행을 추출해야합니다. 그의 질문에 대해서는 "SAO"또는 "FL-15"문자열 중 하나와 정확히 일치 시키려고한다고 가정 할 수 있습니다. – Wilduck

+0

당신이 옳다고 생각합니다. 대안을 추가했습니다. –

4

할 것입니다하지만 데이터가 data.frame 이미있는 경우, 직접이 작업을 수행 할 수 있습니다. 그렇지 않은 경우 먼저 dataset <- data.frame(dataset)을 실행하십시오.

거기에서 :

dataset[dataset$REC.TYPE == "SAO " | dataset$RECTYPE == "FL-15",] 

은 당신이 찾고있는 무엇을 반환해야합니다. For 루프는 R에서 매우 비효율적입니다. R 튜토리얼을 읽은 후에는 R inferno이 일반적인 함정을 피하는 방법을 알려줍니다.

이 특정 행의 작동 방식은 기준과 일치하는 행만 반환하여 데이터 프레임을 필터링하는 것입니다. 자세한 내용은을 R 인터 피터에 입력 할 수 있습니다.

+2

for 루프는 괜찮습니다. 모든 것을 설정해야합니다. 그러나 실제 혜택은 벡터화에서 비롯됩니다. http://stackoverflow.com/a/3131278/322912 –

+0

을 참조하십시오. 루프를 적용하려면 비슷한 시간이 걸릴 수 있습니다.그러나 벡터화는 어느 것보다 훨씬 빠릅니다. 게시 한 코드의 버전은 벡터화와 같습니다. 각 행에서 항등 여부를 확인하는 대신 벡터 연산으로 항등 여부를 확인합니다. – Wilduck

+0

어쨌든 +1은 R 인페르노에 대한 참조입니다. OP는 메시지를 감상 할만큼 똑똑합니다. –

3

다른 포스터에서 말했듯이, 서브 세트 [의 작업을 반복하는 것은 느립니다. 대신 전체 벡터에서 작동하는 함수가 바람직합니다.

귀하의 기준이 모두 REC.TYPE에 영향을 주었다고 가정합니다. 내 솔루션 기능을 사용합니다 %in% :

dataset <- dataset[dataset$REC.TYPE %in% c("SAO","FL-15"),] 
관련 문제