Как отфильтровать значения, если они находятся в пределах диапазонов, чтобы добавить их в качестве нового столбца во фрейме данных - PullRequest
0 голосов
/ 31 октября 2019

У меня есть большие фреймы данных с именами «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

Я рекомендую любые идеи.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Попробуйте с:

X$TargetGenes <- apply(X, 1, 
                       function(v) {
                         ifelse(length(k <- which(v >= Y$chromStart & v <= Y$chromEnd)) > 0, 
                                as.character(Y$TargetGenes[k]), 
                                NA)
                         })
0 голосов
/ 31 октября 2019

Вы можете взглянуть на fuzzyjoin:

data <- tibble(X = 1:5)
iris %>% 
  fuzzyjoin::fuzzy_left_join(data,
                             by = c("Sepal.Length" = "X",
                                    "Sepal.Width" = "X"),
                             match_fun = c(`>`, `<`))

Однако, это может быть довольно медленно, в зависимости от вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...