2012-07-17 6 views
1

데이터 프레임이 2 개 있습니다.R의 보조 데이터 프레임에 행이있는 경우 제외

df1-

col1 col2 col3 col4 col5 
name1 A  23  x  y 
name1 A  29  x  y 
name1 B  17  x  y 
name1 A  77  x  y

 
col1 col2 col3 
B  17  LL1 
Z  193  KK1  
A  77  LO9 
Y  80  LK2 

df2- 나는 COL2와 DF1의 COL3이 COL1 및 DF2의 COL2와 동일하지 않은 경우 DF1에서 해당 행을 반환하고자합니다.

출력은

col1 col2 col3 col4 col5 
name1 A  23  x  y 
name1 A  29  x  y

솔루션을 BE-한다 나는이 솔루션은 잘 작동

unique.rows <- function (df1, df2) { 
    out <- NULL 
    for (i in 1:nrow(df1)) { 
    found <- FALSE 
    for (j in 1:nrow(df2)) { 
     if (all(df1[i,2:3] == df2[j,1:2])) { 
     found <- TRUE 
     break 
     } 
    } 
    if (!found) out <- rbind(out, df1[i,]) 
    } 
    out 
} 

found-하지만 처음에, 나는 작은 dataframes을 신청했다. 이제 내 df1에는 약 10k 개의 행이 있고 df2에는 약 7 백만 개의 행이 있습니다. 지난 2 일간은 달리기 만하고 실행 중입니다. 누구든지이 작업을 수행하는 빠른 방법을 제안 할 수 있습니까?

if (!found) out <- rbind(out, df1[i,]) 

당신은 지속적으로 개체에 대한 새로운 메모리를 할당하기 위해 운영 체제를 일으키는 data.frame을 성장 : 아마 당신을 물고 무엇

답변

3

> df1[!paste(df1$col2,df1$col3)%in%paste(df2$col1,df2$col2),] 
    col1 col2 col3 col4 col5 
1 name1 A 23 x y 
2 name1 A 29 x y 
시도
2

라인입니다. 충분한 공간이있는 data.frame을 미리 할당 한 다음 올바른 색인에 올바른 출력을 할당하는 것이 좋습니다. 이것은 몇 가지 진도를 빠르게해야합니다.

또한 R은 너무 자주 벡터화되어 명시 적 루프가 필요하지 않습니다. 예를 들어 @ttmaccer의 대답을보십시오. 또한 이러한 종류의 작업에 번개가 빠른 data.table을 살펴볼 수도 있습니다.

관련 문제