Я пробую некоторые purrr
идиомы - особенно функции, которые циклически (или применяют, если хотите) функции через один data.frame и сравнивают со всеми другими строками в другом data.frame... и фильтруют декартово произведение на основе этого сравнения функция..
> df1
chr start end
(fctr) (int) (int)
1 chr1 9069 9176
2 chr1 10460 11368
3 chr1 34633 35625
4 chr1 36791 37023
> df2
chr start2
(fctr) (dbl)
1 chr1 9169
2 chr1 10360
3 chr1 34633
Итак, простой пример функции:
> is.between <- function(x1, y1, y2){
ifelse(x1 >= y1 & x1 <= y2, TRUE, FALSE)
}
Результат, который я ищу (на данный момент), должен быть 2 на 4 data.frame df3
как
# desired result
chr start end start2
(fctr) (int) (int)
1 chr1 9069 9176 9169
2 chr1 34633 35625 34633
Наивно тогда я попытался использовать функцию purrr::cross_n
вот так...
> cross_n(list(df2$start2, df1$start, df1$start), .filter = is.between)
Конечно, это не работает, это поиск по декартовому произведению 3 входных столбцов (48 комбинаций). Я хочу найти комбинации df2$start2
против [df1$start
и df1$end
] (12 комбинаций).
И так... Есть ли способ сделать это в рамках purrr
?
Не могу понять это с cross_n
или cross2
и ошибаюсь.. Я не совсем понимаю документы по cross_d
purrr
. Я бы порекомендовал посмотретьdata.table::foverlaps()
- person davechilders   schedule 22.02.2016is.between
- это просто пример. Меня действительно интересует этот тип контроля декартовых комбинаций. Если существует элегантное решение, я мог бы использовать его во многих местах. - person Stephen Henderson   schedule 22.02.2016ifelse(x1 >= y1 & x1 <= y2, TRUE, FALSE)
и ванильнойx1 >= y1 & x1 <= y2
? - person Frank   schedule 22.02.2016