2014-03-26 3 views
5

다음 기능을 작성했는데 작동합니다. 그러나 df1에 1700 개의 행이 있고 df2에 70000 개의 행이 있으면 매우 느립니다. 어쨌든 효율성을 향상시킬 수 있습니까?데이터 프레임의 각 행이 다른 데이터 프레임에 포함되어 있는지 확인하십시오.

rowcheck <- function(df1, df2){ 
     apply(df1, 1, function(x) any(apply(df2, 1, function(y) all(y==x)))) 
} 

난에 적용하려면이 기능을 쓴 예는 다음과 같습니다

df1=data.frame(a=c(1:3),b=c("a","b","c")) 
df2=data.frame(a=c(1:6),b=rep(c("a","b","c"),2)) 

DF1의 각 행에 대해, 내가 원하는을 : 나는 DF1의 각 행은 DF2의 행으로 포함되어 있는지 여부를 확인하려면 df2에 행으로 포함되어 있는지 확인하십시오. 이 함수를 길이 nrow (df1)의 논리 벡터로 되 돌리고 싶습니다.

도움 주셔서 감사합니다.

+1

아마도'모두 (% % in % x) 시도 할 수 있을까요? 문제를 보여주는 간단한 예제를 제공하는 것이 좋습니다. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

** dplyr ** 패키지에는 사용자가 조사 할 수있는 data.frame의 'setdiff'메소드가 있습니다. – joran

+0

그렇지 않으면 나는 u <- do.call (붙여 넣기, df1) 및 v <- do.call (붙여 넣기, df2)로 줄마다 값 줄을 붙여 넣을 것이고 % v에서 u %를 수행하지만 계산을 확인하지는 않습니다 시간 – droopy

답변

6

한 가지 방법은이다 사용하기 때문에, 그것은 빠르게도

duplicated(rbind(df2, df1))[-seq_len(nrow(df2))] 

시도 행을 함께 붙여넣고 %in%과 비교하십시오. 결과는 요청한대로 길이가 nrow(df1) 인 논리 벡터입니다.

do.call(paste0, df1) %in% do.call(paste0, df2) 
# [1] TRUE TRUE TRUE 
+0

Thanks @RichardScriven. 그래서 기본적으로 열 차원을 1로 줄이므로 %를 %로 사용할 수 있습니다. 그래서 %의 %는 하나의 차원 적 변수 검사에서만 작동합니다. –

6

시도 :

Filter(function(x) x > 0, which(duplicated(rbind(df2, df1))) - nrow(df2)) 

그것은 df2에서 발생 df1에있는 행 번호를 알려줍니다. 당신은 리처드 Scriven에의 대답처럼 전에 논리의 원자 벡터를 원하는 경우 내부 C 함수 duplicated를 (나의 rowcheck2입니다)

> microbenchmark(rowcheck(df1, df2), rowcheck2(df1, df2)) 
Unit: milliseconds 
       expr  min  lq median  uq  max neval 
    rowcheck(df1, df2) 2.045210 2.169182 2.328296 3.539328 13.971517 100 
    rowcheck2(df1, df2) 1.046207 1.112395 1.243390 1.727921 7.442499 100 
0

그냥이 쿼리에서 내 두 센트를 제공하고 싶습니다. plyr 기반 솔루션 :

nrow(match_df(df2, df1)) 

..이 (모든 컬럼에 대한) DF2에 대해 DF1의 각 행을 확인하고 당신에게 DF2에 포함 DF1의 행의 수를 줄 것이다.

관련 문제