1

私は2つのデータフレームを持っています。

df1-

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

df2-

   
col1 col2 col3
B17 LL1
Z 193 KK1       
A77LO9
Y80LK2       

df1 の col2 と col3 が df2 の col1 と col2 と等しくない場合、df1 からこれらの行を返したいと思います。

出力は-

col1 col2 col3 col4 col5
name1 A 23 xy
name1 A 29 xy

私が見つけた解決策-

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
}

このソリューションは正常に機能していますが、最初は小さなデータフレームを申請していました。現在、私の df1 には約 10,000 行あり、df2 には約 700 万行あります。過去2日間から実行中です。誰でもこれを行うための迅速な方法を提案できますか?

4

2 に答える 2

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
于 2012-07-17T14:57:05.017 に答える
2

おそらくあなたを噛んでいるのは次の行です:

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

継続的に data.frame を拡張すると、オペレーティング システムはオブジェクトに新しいメモリを割り当てます。十分な余裕のある data.frame を事前に割り当ててから、適切な出力を適切なインデックスに割り当てることをお勧めします。これにより、速度が数桁向上するはずです。

さらに、R はベクトル化されて動作するため、多くの場合、明示的なループは必要ありません。たとえば、@ttmaccer による回答を参照してください。data.tableまた、これらの種類の操作を非常に高速に実行できる を参照することもできます。

于 2012-07-17T14:54:20.263 に答える