私はこのトピックに関する同様の投稿を見ましたが、解決策を理解できませんでした。基本的に、スコアといくつかのNAを含むデータテーブル(DT1)があります。「NA」がある場合は常に、両方のテーブル(トラクト)に共通の列を持つ別のデータ(DT2)テーブルを参照し、DT1のNAをDT2のスコア列の値で更新するプロセスが必要です。効率的なオプションだと思うので、データテーブルクラスを選択しています。
DT1
tract CreditScore
1: 36107020401 635
2: 36083052403 NA
3: 36091062602 NA
4: 36067013000 NA
5: 36083052304 NA
DT2
tract CreditScore
1: 36107020401 635
2: 36083052403 650
3: 36091062602 335
4: 36067013000 777
5: 36083052304 663
data.tableの概念の一部に対して、新しい(より包括的な)HTMLビネットを作成しました。私たちが取り組んでいる他のビネットについては、こちらをご覧ください。私は結合用のビネットに取り組んでいます。これが完了すると、これらのタイプの問題がより明確になることを願っています。
アイデアは、最初setkey()
にDT1
列に進むことtract
です。
setkey(DT1, tract)
data.tablesでは、フォームの結合にx[i]
はのキーx
が必要ですが、必ずしものキーである必要はありませんi
。これにより、次の2つのシナリオが発生します。
i
キーセットもある場合-の最初のキー列はの最初のキー列i
と一致しx
、2番目は2番目と一致します。
i
キーが設定されていない場合-の最初の列はi
の最初のキー列と照合されx
、2番目の列はi
の2番目のキー列と照合さx
れます。
この場合、の最初の列i
もであるためtract
、のキーの設定はスキップしますi
。
次に、フォームの結合を実行しx[i]
ます。これを行うことによりi
、一致する行ごとにインデックスx
が計算され、結合結果が具体化されます。ただし、結合結果全体を新しいdata.tableとして使用する必要はありません。むしろ、それらの一致する行の 'sでDT1
' sCreditScore
列を更新したいと思いDT2
ます。
data.tablesでは、j
次のように式を指定することで、結合中にその操作を実行できます。
DT1[DT2, CreditScore := i.CreditScore]
# tract CreditScore
# 1: 36067013000 777
# 2: 36083052304 663
# 3: 36083052403 650
# 4: 36091062602 335
# 5: 36107020401 635
DT1[DT2
パーツは、の各行に一致する行を検索DT1
しDT2
ます。また、一致するものがある場合は、DT2
の値をで更新する必要がありDT1
ます。i.CreditScore
これは、-を使用して実現します。これは、DT2
のCreditScore
列を参照します(とdata.tablesのi.
間で同じ名前の列を区別するために使用されるプレフィックスです)。x
i
更新:コメントで指摘されているように、上記のソリューションでは、の非NA値も更新されDT1
ます。したがって、それを行う方法は次のようになります。
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
これらの行にCreditScore
からDT1
IS NA
、交換CreditScore
からDT1
の値とCreditScore
から得られるの結合DT2[.(.SD)]
、ここで.SD
すべての行含まdata.tableのサブセットに対応CreditScore
ですNA
。
HTH
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加