2016-06-05 3 views
1

나는 최적화하고자하는이 벡터의 값/문자열에 해당하는 경우 dataframe의 열 및 검사의 선택 집합을 반복 루프에 대한 중첩 된 다음apply?를 사용하여 R에서 중첩 for 루프를 최적화합니다.

Positions=c() 
for (col in vectorCols) { 
    for (code in vectorCodes){ 
     Positions<- c(Positions,which(as.numeric(df[,col])==code)) 
    } 

dataframe 800,000로, 매우 큰 행. vectorCodes는 100 개의 항목으로 구성 될 수 있으며 약 20 개의 선택된 열 (2000 개 중 개)이 될 수 있습니다.

은 또한 다음과 같은 것을 시도했다, 그러나

FunctionGrepCol<-function(col){ 
    Positions <- unlist(lapply(vectorCodes , function(x) (Positions,which(as.numeric(df[,col])==x)))) 
    } 
    Positions <-unlist(lapply(vectorCols, FunctionGrepCol)) 

을 최적화하기 위해 적용 기능에 루프 중첩을 넣어 결합하는 방법이 도움이되지 않았다?

+0

작은 예제 입력과 예상 출력을 게시 할 수 있습니까? 여기서 제공 한 것을 토대로 작업 코드를 제공하기가 어렵습니다. – Gopala

+1

'which'는 이미 벡터화되었으므로 왜 그걸 전혀 루핑하고 있는지 확신 할 수 없습니다. 예 :'x <- sample (1:10, 100, replace = TRUE); (% x % in % c (2, 3))' – Gopala

+0

%는 % for가 for 루프보다 느리다는 것을 알았지 만 실제 타이밍이 없으므로 시간을 잡으려고 노력할 것입니다. 편집 : 흠, 좋아, 실제로 훨씬 더 빠릅니다. 나는 for 루프가이 경우 더 빠르다고 생각한 이유를 모르겠습니다. 매우 감사합니다. – tafelplankje

답변

1

열 이름을 반복하고 하위 집합을 지정하는 대신이 솔루션을 시도해 볼 수 있습니다. 먼저 데이터 프레임의 하위 집합을 만든 다음 목록처럼 반복 할 수 있습니다.

Positions <- unlist(lapply(df[, vectorCols], function(col) which(col %in% vectorCodes))) 
관련 문제