2011-08-06 26 views
1

我需要你心愛的幫助...R:連接/分配兩個重疊數據集的值

我有兩個數據集。一個人將姓名分配給交易ID,另一個將人員ID分配給(相同種類)的交易ID。我想知道,哪個人有哪個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。

結果(應該像以下)

personID Name 
123   Paul 
210   Bob 
988   Jack 

難點:

  • 重疊具有不同數量的元件(鮑勃& 210)
  • TradeIDs具有多個連接到不同的personID和名稱( tradeID 8)
  • 重疊不必是100%(傑克& 988)

思想&試驗

  • 嘗試:數據幀比較庫& &的重塑庫(沒提供任何有用的方法)
  • 想法:創建personID和名稱向量& &比較向量(不知道如何使矢量)& &向量具有最高重疊

連接是否有例如解決這個問題的方法通過數據幀比較?

非常感謝您的幫助!

回答

0

我會做的是:

  1. 合併兩個在一起
  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)) 

由於Bob與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!感謝您的早日回覆!不幸的是,鮑勃的7值不是一個錯字錯誤。在你的修改中,名稱值變得截然不同,所以這就是爲什麼可以解決的問題---從查看數據來看,這是Bob是Nr的最合理的答案。 210,因爲它重疊7和8(210的3個值的66%)。對於988鮑勃只重疊1(較大的「矢量」的50%)。合併爲您提供從personID到tradeID的所有可能路徑...您知道我的問題是什麼嗎? –

+0

那麼你需要決定一個算法。 988應該分配什麼,因爲它是一個50/50的領帶?您可以使用'mgd < - merge(datA,datB,all = TRUE)'來查看完整的合併表,並從那裏計算出personID的名稱以獲得計數。 –