私は動作するコードを持っています。しかし、それは遅いです、そして私はそれをスピードアップしたいと思いますので、私は約2万回の観測データセットまでスケールアップすることができます。一致を見つけてdata.frameに追加する方法がより速くなりますか?
私は2つのデータフレームを持っています。そのうちの1つは、高速検索と結合のためにdata.tableパッケージを使用してdata.tableに変換します。 3つのフィールドが2番目のデータセットのレコードと一致すると、1つのデータセットからレコードを記録します。
Original.df(データフレーム)とLookHereForMatches.dt(キーがa1、a2、a3のdata.table)。 Original.dfは100,000〜300,000の観測値を持ち、LookHereForMatches.dtはおそらく2xになります。
私はOriginal.dfの各観測をループし、LookHereForMatches.dtで特定の基準に一致する観測値を探します。 LookHereForMatches.dtのいくつかのフィールドとOriginal.dfのいくつかのフィールドが必要です。私はサブセット()を使用して、必要な列だけを取得します。
誰かが私のコードのどの部分が最悪か/遅いかを教えてくれるかもしれません。私はそれがrbind(cbind())の部分だと信じなければならない。それが正しい方法だとは思われません。
matched_data.df <- data.frame()
for(i in 1:nrow(Original.df)){
a1 <- Original.df$col1
a2 <- Original.df$col2
a3 <- Original.df$col3
# Use data.table library "join" functionality to get matches (will find at least 1 and up to 4 matches, usually only 1 or 2)
match.df <- data.frame(LookHereForMatches.dt[J(a1, a2, a3)], stringsAsFactors=FALSE)
# combine matches with original data and add to data.frame to create big list of data with matches
matched_data.df <- rbind(cbind(match.df, Original.df[i,], stringsAsFactors=FALSE), matched_data.df)
}
ここでUPDATE
は、データがどのように見えるかを大まかにです。 (明らかにRとStackExchangeの初心者
テーブルをもっときれいにする方法を見つけ出し、それを修正するために戻ってきます。
テーブルを修正するための@joran。)テーブルはかなり基本的なものです。私は、最初のテーブルから各行を見つけて、それをa1、a2、およびa3の2番目のテーブルのすべての適切な行に一致させたいだけです。この例では、Original.dfの最初の行は、3行を返すLookHereForMatches.dtテーブルの行1,2、および3とペアにする必要があります。
Original.df <- read.table(textConnection('
a1 a2 a3 text.field numeric.field
123 abc 2011-12-01 "some text" 1.0
124 abc 2011-11-12 "some other text" 0.1
125 bcd 2011-12-01 "more text" 1.2
'), header=TRUE)
LookHereForMatches.df <- read.table(textConnection('
a1 a2 a3 text.field numeric.field Status_Ind
123 abc 2011-12-01 "some text" 10.5 0
123 abc 2011-12-01 "different text" 0.1 1
123 abc 2011-12-01 "more text" 0.1 1
125 bcd 2011-12-01 "other text" 4.3 0
125 bcd 2011-12-01 "text" 2.2 0
'), header=TRUE)
LookHereForMatches.dt <- data.table(LookHereForMatches.df, key=c("a1","a2","a3"))
は、あなたがより良い答えを得るでしょう、...私を許して。しかし条件付きのようなものをマッチさせることはできませんか? 'Origian.df [Origional.df $ a1%%LookHereForMatchers.dt $ a1&Origional.df $ a2%in%LookHereForMatches.dt $ a2、]'です。 'forループ'は遅いですが、 'rbind(cbind(...))'ははるかに遅いです。理想的には、割り当て前に 'matched_data.df'のフルサイズを割り当てることができます。もしあなたができないのであれば、私が上記のようなものを使っていくつかの助けになるはずです... – Justin
なぜ、あなたは単にdata.tableの間で1つの結合をすることができないのですか? – joran
サンプルデータを追加するように更新しました。 %で%を調べます。私はdata.tables間の結合を行うことはできません理由は...私はRの新人です。私も参加を検討します。 – user791770