【问题标题】:Find matched pairs and their ids for matching records查找匹配的对及其 id 以匹配记录
【发布时间】:2017-10-27 15:55:25
【问题描述】:

我有一个庞大的数据集,我需要根据某些标准从中匹配样本。例如,对于某个位置和行政区的每个电影明星,请为我找到两个(随机)不是电影明星的人。电影明星为 1,非电影明星为 0。

location<- c('manhattan', 'manhattan' ,'manhattan', 'manhattan', 'manhattan', 'manhattan')
moviestar<- c(0,1,0,0,0,1)
id<- c(1,2,3,4,5,6)
 borough <- c('williamsburg', 'williamsburg', 'williamsburg', 'williamsburg', 'williamsburg','williamsburg')

 df<- data.frame(location,moviestar, borough, id)

我想创建一个子集,该子集将电影明星与居住在同一地点和行政区的其他两个非电影明星(随机挑选)配对。有什么建议吗?基本上有 6 个人住在曼哈顿,有两个星星住在曼哈顿,我想为每个星星匹配,在这种情况下,2 和 6 是星星,那么我想在最终数据中匹配对如下(一些随机对):

我期待的输出是这样的,

    matcheddata
    location moviestar borough       id matchpairid
    manhattan    1    williamsburg   2  match1
    manhattan    0    williamsburg   1  match1
    manhttan     0    williamsburg   5  match1
    manhattan    1    williamsburg   6  match2
    manhattan    0    williamsburg   3  match2
    manhttan     0    williamsburg   5  match2

【问题讨论】:

    标签: r dplyr data.table tidyr


    【解决方案1】:

    应该这样做:

    library(data.table)
    setDT(df)[, .(moviestar.id = id[moviestar == 1],
                  match.id = sample(id[moviestar == 0], 2*sum(moviestar == 1)))
              , by = .(location, borough)]
    #    location      borough moviestar.id match.id
    #1: manhattan williamsburg            2        3
    #2: manhattan williamsburg            6        5
    #3: manhattan williamsburg            2        1
    #4: manhattan williamsburg            6        4
    

    之后你可以按摩成你喜欢的任何形式。

    【讨论】:

    • 我没有得到预期的输出,对于每颗星,我想要两个非星,迭代后只给我 4 行,我无法得到匹配对id为2的明星,有什么想法吗?谢谢你:)
    • 我已经添加了上面的输出,因此您可以更明确地评论这不是您所要求的。正如您在上面看到的,对于每颗星,有 2 个匹配的非星。
    • 2 是一颗星,我需要找到两对匹配的非星(如记录 1、3,5)和两对 id 为 6 的星。但在你的情况下,我没有看任何非电影明星。请查看我在问题中的输出。非常感谢!
    • 我不明白你想要什么。上面的星 2 与非星 1 和 3 相匹配;而星6与非星4和5相匹配。你是说要为每个星匹配4个人吗?在这种情况下,乘以 4 而不是 2,然后做一个带有替换的样本(因为在示例中您只有 4 人可供选择)。
    • 我想我知道你在这里做了什么。那很整齐!我想我需要将它与原始匹配对合并以复制我的结果。有没有办法让我得到自我匹配,即星 2 也匹配星 2 来得到我的结果?
    【解决方案2】:

    这是另一种直接产生预期结果的方法,其中每行电影明星后面跟着两行随机挑选的非电影明星:

    library(data.table)
    setDT(df)[, {
      n_stars <- .SD[moviestar == 1, .N]
      rbind(.SD[moviestar == 1], .SD[moviestar == 0][sample.int(.N, 2L * n_stars)])[
        , pairid := rep(1:n_stars, 3L)][order(pairid)]
    }, by = .(location, borough)]
    
        location      borough moviestar id pairid
    1: manhattan williamsburg         1  2      1
    2: manhattan williamsburg         0  3      1
    3: manhattan williamsburg         0  1      1
    4: manhattan williamsburg         1  6      2
    5: manhattan williamsburg         0  4      2
    6: manhattan williamsburg         0  5      2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多