【问题标题】:R: Connect/assign values of two overlapping data setsR:连接/分配两个重叠数据集的值
【发布时间】:2011-08-06 07:11:37
【问题描述】:

我需要你心爱的帮助...

我有两个数据集。一个将人名分配给 tradeID,另一个将人员 ID 分配给(相同类型的)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       |

问题:

我想找出tradeID的重叠/交集,这样我就知道哪个名字属于哪个personID。

结果 (应该如下所示)

personID    Name
123         Paul
210         Bob
988         Jack

困难:

  • 重叠有不同数量的元素 (Bob & 210)
  • TradeID 与不同的 personID 和姓名有多个连接 (tradeID 8)
  • 重叠不必是 100% (Jack & 988)

想法和试验

  • 已尝试:数据框比较库 && 重塑库(未提供任何有用的方法)
  • 想法:创建 personID 和姓名的向量 && 比较向量(不知道如何制作向量)&& 连接重叠度最高的向量

有没有办法解决这个问题,例如通过数据框比较?

非常感谢您的帮助!!!

【问题讨论】:

    标签: r compare dataframe intersection overlap


    【解决方案1】:

    我要做的是:

    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) )
    

    这在 stopifnot 上失败了,因为 Bob 与 personID 210 和 988 相关联,这可能是您的示例数据中的拼写错误....如果将其删除,则效果很好:

    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
    

    【讨论】:

    • 顺便说一句,你的答案最终是“PB&J”这一事实让我很高兴。
    • 嘿gsk3!感谢您的早日回复!不幸的是,鲍勃的 7 值不是拼写错误。在您的修改中,名称-值变得不同,这就是为什么可以解决的原因 --- 从仅查看数据来看,Bob 是 Nr 是最合乎逻辑的答案。 210,因为它与 7 和 8 重叠(210 的 3 个值的 66%)。对于 988 Bob 仅重叠 1(较大“向量”的 50%)。合并为您提供了从 personID 到 name 通过 tradeID 的所有可能路径...您知道我的问题是什么吗?
    • 那么你需要决定一个算法。 988 应该分配给什么,因为它是一个 50/50 的领带?您可以使用mgd &lt;- merge(datA,datB,all=TRUE) 查看完整的合并表,然后从那里按 personID 对名称进行统计以获取计数。
    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2021-06-27
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多