2011-08-06 16 views
1

私はあなたに愛された助けが必要です...R:2つの重複データセットの値を接続/割り当て

私は2つのデータセットを持っています。 1人がtradeIDに人名を割り当て、もう1人が(同じ種類の)tradeIDに割り当てます。私は、誰がどのIDを持っているかを知りたい。

データ:

personID tradeID  Name tradeID 
123   10  | Bob  7 
123   5  | Bob  8 
210   1  | Jack 3 
210   7  | Jack 11 
210   8  | Paul 5 
988   11  | Paul 10 
988   8  | 

問題:

私はtradeIDsの重複/交差を知りたいので、私はPERSONIDするためにどの属する名前を知っているだろう。

  • オーバーラップ要素(ボブ& 210)の異なる数を有する
  • TradeIDs有する:(下記のようになります)

    personID Name 
    123   Paul 
    210   Bob 
    988   Jack 
    

    困難が

    結果異なるpersonIDと名前への複数の接続tradeID 8)

  • 重複は100%である必要はありません(ジャック& 988)

アイデア&裁判

しようとしました
  • :データフレームの比較ライブラリを& &リシェイプライブラリ(のdidnどの有用な方法も提供しない)
  • アイデア:personIDと名前のベ​​クトルを作成する& &ベクターには、例えば、この問題を解決する方法はあり& &が最高の重複

とベクトルを接続する(ベクトルを作成する方法を知りませんでした)データフレーム比較による?

ありがとうございました!私はどうだろう何

答えて

0

は次のとおりです。

  1. は、2つの
  2. すべてがチェックアウトした場合、それは、複数のPERSONID(!悪い)
  3. に一致しているかどうかを確認するためにそれぞれの名前の中に比較マージ重複をドロップ

だから、何かのように:

datA <- data.frame(personID=c(123,123,210,210,210,988,988),tradeID=c(10,5,1,7,8,11,8)) 
datB <- data.frame(name=c("B","B","J","J","P","P"), tradeID=c(7,8,3,11,5,10)) 
mgd <- merge(datA,datB) 
library(taRifx) 
stopifnot(all(by(mgd$personID,as.factor(mgd$name),distinct) <=1)) 
result <- subset(mgd, !duplicated(mgd$name),select=c(-tradeID)) 

ボブはpersonID 210と988に関連付けられているため、stopifnotで失敗します。これはおそらくサンプルデータのタイプミスです。それが削除された場合、正常に動作します。

datA[7,"tradeID"] <- 12 
mgd <- merge(datA,datB) 
result <- subset(mgd, !duplicated(mgd$name),select=c(-tradeID)) 
result 
    personID name 
1  123 P 
2  210 B 
5  988 J 
+0

補足として、あなたの回答が「PB&J」になるということは私を幸せにします。 –

+0

ねえgsk3!早い返信をありがとう!残念ながら、Bobの7の値は誤字ではありませんでした。あなたの変更では、名前の値が異なっているので、なぜ解けるのですか?ちょうどデータを見るだけで、BobがNrであるという最も論理的な答えです。これは7と8が重なっているためです(210の3つの値の66%)。 988の場合、Bobは1つだけ重複します(より大きな "ベクトル"の50%)。マージは、personIDから名前へのすべての可能なパスをtradeIDを使って提供します...私の問題が何であるか知っていますか? –

+0

アルゴリズムを決定する必要があります。それは50/50のネクタイであるため、988はどのように割り当てられるべきですか?完全なマージテーブルを見るには 'mgd < - merge(datA、datB、all = TRUE) 'を使い、personIDで名前を集計してカウントを取得します。 –

関連する問題