来自与变量匹配的另一列的查找值

时间:2017-04-11 15:05:41

标签: r loops dataframe lookup

我的数据框如下:

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

我想创建另一个包含" trait_id"的估计值的变量。为每个" sire_id"和" dam_id"。

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

我想要的结果是:

R

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:5)

您可以使用match(col, df$animal_id); animal_idtrait中的col提供了相应的元素索引,可以进一步用于定位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 的值:

<form role="form" autocomplete="off" action="includes/functions/fisa-init.php" method="POST">
<?php
   connectDB();
   $query = mysqli_query($mysqli, "SELECT * FROM `optionale`") or die(mysqli_error($mysqli));
   while($row = mysqli_fetch_array($query))
   { 
?>
   <span><?php echo $row['denumire']; ?></span>
   <input type="text" name="nrBucati">
   <input type="hidden" value="<?php echo $row['cod']; ?>" name="codProdus">
<?php } ?>
</form>

答案 1 :(得分:5)

使用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
  6. 这种方法优于match的一个优点是它扩展到多个列的连接,如on = .(xcol = icol, xcol2 = icol2)甚至&#34;非等连接&#34;比如on = .(xcol < icol)。此外,它是在表格上进行操作的一致语法的一部分(在包introductory material中解释),而不是一个任务的专用代码。

答案 2 :(得分:1)

您可以在一次运行中使用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