Сравнение одного значения в нескольких строках в одном фрейме данных со значениями в нескольких строках во втором фрейме данных - PullRequest
0 голосов
/ 15 мая 2018

Сценарий:

2-столбец dataframe_1 (300 000 строк)

head (dataframe_1):

CHR POS

1 2000

1 3000

2 1500

3 3000

3-столбец dataframe_2 (300 строк)

head (dataframe_2):

CHR POS_START POS_END

1 1500 2500

1 3200 4000

2 1200 1600

2 2000 2200

3 5000 5500

4 1000 1200

Цель состоит в том, чтобы взять dataframe_1 и сравнить столбец POS каждой строки с dataframe_2 (столбцы POS_START и POS_END) и вернуть вектор (length = nrow (dataframe_1)), который указываетВ какой строке dataframe_1 указано значение POS, которое находится в пределах диапазона, указанного в dataframe_2.Обратите внимание, что каждое значение POS связано с определенным значением CHR.

Пример вектора возврата:

CHR POS EXAMPLE_RETURN_VECTOR

1 2000 TRUE

1 3000 FALSE

2 1500 TRUE

3 3000 FALSE

Какая здесь лучшая стратегия?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вот ответ с dplyr:

library(dplyr)

df1 <- tribble(
     ~CHR, ~POS,
     1,  2000,                  
     1,  3000,
     2,  1500,
     3,  3000
)

df2 <- tribble(
     ~CHR, ~POS_START, ~POS_END,
     1, 1500, 2500,                  
     1, 3200, 4000,
     2, 1200, 1600,
     2, 2000, 2200,
     3, 5000, 5500,
     4, 1000, 1200
)

df1 %>% 
     left_join(df2, by = 'CHR') %>% 
     mutate(IN_RANGE = POS >= POS_START & POS <= POS_END) %>% 
     group_by(CHR, POS) %>% 
     summarize(IN_RANGE = sum(IN_RANGE) > 0)
0 голосов
/ 15 мая 2018

Можно ли предположить, что каждое значение CHR появляется только один раз? Можем ли мы также предположить, что каждое значение CHR, которое встречается в dataframe_1, также находится в dataframe_2 и наоборот? Можем ли мы также предположить, что обе таблицы отсортированы по значению CHR? Если это так, вы можете просто создать новый столбец следующим образом:

dataframe_1['NEW_COLUMN'] = dataframe_1.POS >= dataframe_2.POS_START & dataframe_1.POS <= dataframe_2.POS_END

Если вы не можете сделать все эти предположения, то вы можете:

1) Объедините обе таблицы, в которых они имеют совпадающие значения CHR, отфильтруйте строки с отсутствующими данными, а затем создайте новый столбец или

2) Выполните цикл по каждой строке dataframe_1, и для каждой строки сравните значение POS со значением dataframe_2[dataframe_2.POS_START == dataframe_1.POS_START] и dataframe_2[dataframe_2.POS_END == dataframe_1.POS_END]

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