Как выбрать строки файла на основе нескольких условий другого файла в R? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть 2 набора данных c. Я фильтрую file1 на основе столбца в file2. Однако мне также нужно учесть второй столбец в файле 2, и я не уверен, как это сделать.

Условие для извлечения строки в файле 1 состоит в том, что только строки, которые имеют положение хромосомы или больше 5000 больше или больше 5000 меньше, чем любое положение хромосомы для вариантов на той же самой хромосоме в файле 2.

Например, мои данные выглядят так:

Файл 1:

Variant   Chromsome   Chromosome Position  
Variant1      2             14000     
Variant2      1             9000              
Variant3      8             37000          
Variant4      1             21000     

Файл 2:

Variant  Chromosome  Chromosome Position  
Variant1     1                 10000                   
Variant2     1                 20000                   
Variant3     8                 30000      

Ожидаемый результат (вариантов с расстоянием более +/- 5000 позиций по сравнению с любой строкой файла 2 в той же хромосоме):

Variant   Chromosome Position     Chromosome
Variant1    14000                  2
Variant3    37000                  8

#Variant1 at 14000, whilst within 5000 + of Variant1 at 10000 in file2 is on a different chromosome and therefore not compared and is kept.
#Variant3 is on the same chromosome as Variant4 in file1 but larger than 5000+ distance and is kept.

Я пытался кодировать, используя unix, однако получил только фильтрацию больше +5 + для каждого варианта без учета хромосомы, и мне посоветовали попробовать кодирование на R, однако я новичок в R и Не уверен, где начать. Я предполагаю, что мне нужен оператор if для «если строка file1 имеет совпадающий номер хромосомы как file2, тогда выполнить фильтрацию больше + 5000 в пределах этого номера хромосомы» с a для l oop для перехода по каждой строке - даже Будем признательны за рекомендации о том, как это сделать.

1 Ответ

1 голос
/ 06 февраля 2020

Используя ваши примеры данных и методы, я пришел к этому data.table -решению

Краткое пояснение в коде.

library( data.table)
#sample data
dt1 <- fread("Variant   Chromosome   Chromosome_Position  
Variant1      2             14000     
Variant2      1             9000              
Variant3      8             37000          
Variant4      1             21000")
dt2 <- fread("Variant  Chromosome  Chromosome_Position  
Variant1     1                 10000                   
Variant2     1                 20000                   
Variant3     8                 30000")

#create lower&upper boundaries for dt2 chromosome position
dt2[, c("low", "high") := .(Chromosome_Position - 5000, Chromosome_Position + 5000)]
#dt2 now looks like this:
#-------------------------------------------------------------
#     Variant Chromosome Chromosome_Position   low  high
# 1: Variant1          1               10000  5000 15000
# 2: Variant2          1               20000 15000 25000
# 3: Variant3          8               30000 25000 35000

#find matches on chromosome, with position bewtene low-high
#  this is done using a non-equi join using the lower and upper boundaries
#  created in dt2 in the previous line.
#  on = .(...) means: Chromosome in dt1 and dt2 have to be the same
#                     Chromosome_Position in dt1 has to be between 
#                       low and high of dt2. Y
#                       You can (of course) use >= and <= if desired.
#  match := i.Variant creates a new column in dt1, with the value of
#                     Variant from dt2 (if a match is found).
#                     If no match is found, the columns gets a <NA>.                          
dt1[ dt2, match := i.Variant,
     on = .(Chromosome, Chromosome_Position > low, Chromosome_Position < high ) ]
#dt1 now looks like this
#see the match-column for found dt1-matches in dt2
#-------------------------------------------------------------
#     Variant Chromosome Chromosome_Position    match
# 1: Variant1          2               14000     <NA>
# 2: Variant2          1                9000 Variant1
# 3: Variant3          8               37000     <NA>
# 4: Variant4          1               21000 Variant2

#discard all found matches (i.e. is.na(Match) == TRUE), and drop match-column,
#  since we no longer need it.
dt1[ is.na(match) ][, match := NULL ][]

#     Variant Chromosome Chromosome_Position
# 1: Variant1          2               14000
# 2: Variant3          8               37000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...