2013-08-09 2 views
1

У меня есть большие наборы данных (d1), как это показано ниже:Использование R для выбора данных на основе другого набора данных

SNP Position Chromosome 
rs1 10010 1 
rs2 10020 1 
rs3 10030 1 
rs4 10040 1 
rs5 10010 2 
rs6 10020 2 
rs7 10030 2 
rs8 10040 2 
rs9 10010 3 
rs10 10020 3 
rs11 10030 3 
rs12 10040 3 

У меня также есть набор данных (d2), как показано ниже:

SNP Position Chromosome 
rsA 10015 1  
rsB 10035 3 

Теперь , я хочу, чтобы выбрать диапазон ОНП в d1 на основе d2 (Position + -5 и той же хромосоме), и записать результаты в текстовый файл, результаты должны быть такими:

SNP(d2) SNP(d1) Position(d1) Chromosome 
rsA rs2 10020 1 
rsA rs3 10030 1 
rsB rs11 10030 3 
rsB rs12 10040 3 

Я новичок в R, может ли кто-нибудь рассказать мне, как это сделать в R? Вы отчасти высоко цените ответ.

+0

Люди могут опробовать ваш вопрос до тех пор, пока вы не покажете нам, что вы пробовали, или, по крайней мере, обеспечиваете воспроизводимый пример (см. Здесь: http://stackoverflow.com/questions/5963269/how-to-make -a-great-r-воспроизводимый пример) –

ответ

1
d2$low <- d2$Position-5 ; d2$high<- d2$Position+5 

Вы можете подумать, что вы могли бы сделать somehting как:

d2$matched <- which(d1$Position >=d2$low & d2$high >= d1$Position) 

.... но не очень, так что вам нужно что-то немного более активное участие .:

d1$matched <- apply(d1, 1, function(p) 
          which(p['Position'] >=d2[,'low'] & 
            d2[,'high'] >= p['Position'] & 
            p['Chromosome']==d2[,"Chromosome"])) 

В основном это проверяет каждую строку d1, существует ли потенциальное совпадение в d2 в диапазоне и на той же хромосоме:

d1  # take a look 
# Then bind matching cases together 
cbind(d1[ which(d1$matched > 0), ], 
     d2[ unlist(d1$matched[which(d1$matched>0)]), ]) 
#-------------------- 
    SNP Position Chromosome matched SNP Position Chromosome low high 
1 rs1 10010   1  1 rsA 10015   1 10010 10020 
2 rs2 10020   1  1 rsA 10015   1 10010 10020 
11 rs11 10030   3  2 rsB 10035   3 10030 10040 
12 rs12 10040   3  2 rsB 10035   3 10030 10040 
+0

Привет, DWin, это действительно помогло мне ... Большое спасибо за помощь ... – user2669497

3

Выполнение слияния по колонке "Хромосома" (например, присоединение 2 таблицы в базе данных на этой колонке):

mrg <- merge(x = d1, y = d2, by = c("Chromosome"), all.y = TRUE) 

Затем фильтрации строк, где позиции Diff < = 5:

result <- mrg[abs(mrg$Position.x - mrg$Position.y) <= 5,] 

Will дайте желаемый результат.

+0

Manji, большое спасибо за ответ ... – user2669497

Смежные вопросы