【问题标题】:Lookup value from another column that matches with variable从与变量匹配的另一列中查找值
【发布时间】:2017-09-07 01:32:04
【问题描述】:

我有一个如下所示的数据框:

animal_id   trait_id    sire_id dam_id
    1         25.05        0       0
    2         -46.3        1       2
    3          41.6        1       2
    4         -42.76       3       4
    5         -10.99       3       4
    6         -49.81       5       4

我想创建另一个变量,其中包含每个“sire_id”和“dam_id”的“trait_id”估计值。

所有的公牛 (sire_id) 和母牛 (dam_id) 也存在于 animal_id 列中。所以我想做的是在 trait_id 中寻找它们的测量值,并在新变量中重复这个变量。

我想要的结果是:

animal_id   trait_id    sire_id trait_sire  dam_id  trait_dam
     1       25.05         0        NA        0        NA
     2       -46.3         1       25.05      2       -46.3
     3       41.6          1       25.05      2       -46.3
     4      -42.76         3       41.6       4       -42.76
     5      -10.99         3       41.6       4       -42.76
     6      -49.81         5      -10.99      4       -42.76

任何建议将不胜感激。

【问题讨论】:

    标签: r loops dataframe lookup


    【解决方案1】:

    您可以使用matchmatch(col, df$animal_id) 给出了 animal_id 中 col 元素的对应索引,可用于进一步定位 trait 的值:

    df[c("trait_sire", "trait_dam")] <- 
        lapply(df[c("sire_id", "dam_id")], function(col) df$trait_id[match(col, df$animal_id)])
    
    df
    #  animal_id trait_id sire_id dam_id trait_sire trait_dam
    #1         1    25.05       0      0         NA        NA
    #2         2   -46.30       1      2      25.05    -46.30
    #3         3    41.60       1      2      25.05    -46.30
    #4         4   -42.76       3      4      41.60    -42.76
    #5         5   -10.99       3      4      41.60    -42.76
    #6         6   -49.81       5      4     -10.99    -42.76
    

    【讨论】:

      【解决方案2】:

      使用 data.table 连接...

      library(data.table)
      setDT(DT)    
      
      DT[, trait_sire := 
        .SD[.SD, on=.(animal_id = sire_id), x.trait_id ]
      ]
      
      DT[, trait_dam := 
        .SD[.SD, on=.(animal_id = dam_id), x.trait_id ]
      ]
      
         animal_id trait_id sire_id dam_id trait_sire trait_dam
      1:         1    25.05       0      0         NA        NA
      2:         2   -46.30       1      2      25.05    -46.30
      3:         3    41.60       1      2      25.05    -46.30
      4:         4   -42.76       3      4      41.60    -42.76
      5:         5   -10.99       3      4      41.60    -42.76
      6:         6   -49.81       5      4     -10.99    -42.76
      

      语法为x[i, on=, j],其中j 是列的某些函数。要了解它是如何工作的,请尝试DT[DT, on=.(animal_id = dam_id)] 及其变体。一些注意事项:

      1. i.* / x.* 语法有助于区分列的来源。
      2. jv := expression 时,将表达式分配给列v
      3. 连接x[i, ...] 使用i 的行来查找x 的行。
      4. on= 语法类似于.(xcol = icol)
      5. j内部,表格本身可以写成.SD

      match 相比,这种方法的一个优点是它可以扩展到多个列上的连接,例如on = .(xcol = icol, xcol2 = icol2),甚至是“非等连接”,例如on = .(xcol &lt; icol)。此外,它是对表进行操作的一致语法的一部分(在包的introductory material 中进行了解释),而不是针对一项任务的专用代码。

      【讨论】:

        【解决方案3】:

        您可以在一次运行中使用match(在基础 R 中)执行此操作(无需循环)

        df[c("trait_sire", "trait_dam")] <- 
        cbind(with(df, trait_id[match(sire_id, animal_id)]), 
              with(df, trait_id[match(dam_id, animal_id)]))
        
          # animal_id trait_id sire_id dam_id trait_sire trait_dam
        # 1         1    25.05       0      0         NA        NA
        # 2         2   -46.30       1      2      25.05    -46.30
        # 3         3    41.60       1      2      25.05    -46.30
        # 4         4   -42.76       3      4      41.60    -42.76
        # 5         5   -10.99       3      4      41.60    -42.76
        # 6         6   -49.81       5      4     -10.99    -42.76
        

        【讨论】:

        • 我认为你可以将with 移到cbind 之外,所以它只写一次。但是,这种看起来像是对 Psidom 的回答的翻版,嗯。
        • @Frank 至于with,确实是的,感谢您提出这一点。虽然可能看起来像重新散列,但请注意lapply 的缺席。我也希望更快。
        • 好的,我想这是一个公平的观点,但对我来说,这似乎是通过......写出循环的所有迭代来避免循环。 (诚​​然,我的回答也是分开写出来的,所以我真的不能抱怨。)
        猜你喜欢
        • 1970-01-01
        • 2021-03-02
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 2018-10-25
        • 2011-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多