У меня есть большие фреймы данных с именами «X» и «Y», которые выглядят так:
Y <- data.frame(chrom = c(21,21,21,21,21),
chromStart = c(14720086, 14759761, 14799594, 14847192, 14860997),
chromEnd = c(14722086, 14761761, 14801594, 14849192, 14862997),
TargetGenes = c("ENSG00000185390", "ENSG00000175302",
"ENSG00000175302", "ENSG00000219280", "ENSG00000226930"))
X <- data.frame(POS = c(14720573, 14720652, 14721241, 14721279, 14721280))
и вот что я пытался сделать:
X$TargetGene <- apply(X$POS, 1, function(v) ifelse(length(k <- which(v >= Y$chromStart & v <= Y$chromEnd))>0,
as.character(Y$TargetGenes[k]), NA))
Iищу решение R для проверки каждой строки в «X» и определяет, находится ли X $ POS между Y $ chrStart и Y $ chrEnd, поэтому затем добавляем соответствующий Y $ ID в «X» в качестве нового столбца с именем «TargetGene»».
Может быть несколько значений из X $ POS, которые вписываются в диапазон в кадре данных Y. Кроме того, это возможно для некоторых X $ POS, которые не находят какой-либо диапазон соответствия в кадре данных Y.
ps значения Y $ chr одинаковы.
Желаемый результат:
> X
POS TargetGene
14720573 ENSG0000017
14720652 ENSG0000017
14721241 <NA>
15221776 ENSG0000022
Я рекомендую любые идеи.