我的数据框如下:
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
任何建议都将不胜感激。
答案 0 :(得分:5)
您可以使用match(col, df$animal_id)
; animal_id
为trait
中的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)]
和各种变体。一些说明:
i.*
/ x.*
语法有助于区分列的位置。 j
为v := expression
时,表达式会分配到列v
。x[i, ...]
使用i
行查找x
行。 on=
语法类似于.(xcol = icol)
。j
内,表格本身可以写为.SD
。这种方法优于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