2016-05-10 1 views
3

Я пытаюсь объединить два набора данных, где переменная (или положение вдоль генома) в одном наборе данных находится в пределах диапазона во втором (положение начала/остановки гена). Однако позиции не уникальны, но вложены в дополнительный столбец (хромосома). То же самое относится к позициям начала/остановки гена. Моя цель - связать каждую позицию с соответствующей аннотацией и эффектом.R, присоединяется к диапазону векторизации

Например:

library(sqldf) 
set.seed(100) 
a <- data.frame(
    annotation = sample(c("this", "that", "other"), 3, replace=TRUE), 
    start = seq(1, 30, 10), 
    chr = sample(1:3, 3, replace=TRUE) 
) 
a$stop <- a$start + 10 
b <- data.frame(
    chr = sample(1:3, 3, replace=TRUE), 
    position = sample(1:15, 3, replace=TRUE), 
    effect = sample(c("high", "low"), 3, replace=TRUE) 
) 

An SQL внутреннее соединение получает меня часть пути туда:

df<-sqldf("SELECT a.start, a.stop, a.annotation, b.effect, b.position 
    FROM a, b 
    inner JOIN a b on(b.position >= a.start and b.position <= a.stop);") 

Но это не объясняет повторение позиции на хромосоме. У меня возникли концептуальные проблемы, обертывающие это в цикл или применимую функцию.

Я не привязан к SQL, это как раз то, как я раньше занимался более простой проблемой. Я также не уверен, что создание дополнительного столбца индекса является подходящим, так как у меня есть тысячи значений хромосом.

Мой желаемый результат будет выглядеть следующим образом:

df$chr<-c("NA","2","2") 
     start stop annotation effect position chr 
1  1 11  this high  3 NA 
2  1 11  this high  10 NA 
3 11 21  this low  14 2 

Где каждый position не был помещен между start и stop точек на правильном chr или дал NA, где нет точек на chr матча.

+0

Мне очень жаль, что я пропустил множество. когда я перезапустил код. Столбец chr - это фиктивные данные, которые я добавил только для того, чтобы показать, что мне нужно. Я ценю вашу помощь. – smm

+0

@smm извините, но я до сих пор не понимаю, что происходит - столбец 'chr' в желаемом результате таинственный - я не понимаю его отношения с' a $ chr' и 'b $ chr' – eddi

+0

спасибо @eddi «позиция», «старт» и «остановка» вложены в число «chr», поэтому они должны быть общими для обоих наборов данных. – smm

ответ

2

Я думаю, что это то, что вы после:

sqldf(
    "Select start, stop, annotation, effect, position, 
    case when a.chr = b.chr then a.chr else NULL end as chr 
    from b left join a 
    on b.position between a.start and a.stop 
    " 
) 
# start stop annotation effect position chr 
# 1  1 11  this high  3 NA 
# 2  1 11  this high  10 NA 
# 3 11 21  this low  14 2  
+1

это именно то, что я был после. Я буду менять желаемый вывод 'chr' для будущих читателей. Это было больно для вас и @eddi, но это помогло мне. Я буду следить за тем, чтобы мои будущие должности не нуждались в телепатии. – smm

4

development version из data.table вводит не-присоединяется к следу, что позволяет:

library(data.table) 
setDT(a) # converting to data.table in place 
setDT(b) 

b[a, on = .(position >= start, position <= stop), nomatch = 0, 
    .(start, stop, annotation, effect, x.position, chr = ifelse(i.chr == x.chr, i.chr, NA))] 
# start stop annotation effect x.position chr 
#1:  1 11  this high   3 NA 
#2:  1 11  this high   10 NA 
#3: 11 21  this low   14 2 
+1

Это захватывающая разработка data.table! – Gregor

+0

Спасибо @eddi, я понимаю, что мой желаемый результат был бессвязным. Это здорово, но я снова проведу данные.Спасибо, что нашли время на этот вопрос - этот ответ будет работать, если я тогда подмножусь в колонке 'chr'. – smm

+0

@smm np - отредактировано для соответствия текущему OP – eddi

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

  • Нет связанных вопросов^_^