объединить два data.frame с условием в R

Я хотел бы сравнить два набора данных df1 и df2 таким образом, чтобы уникальные символы в df2$ID были добавлены в качестве нового столбца в df1 и присвоили значение df2$Xp для каждого гена, если координаты df1 перекрываются с координатами df2 :

 df1 <- read.table(text="
        Gene     chr  Start End 
        Gm12724   4  1000   1105    
        Zfhx2     4  1254   1369    
        Usp17lc   7  5004   5412
        Lingo1    7  5698   5789
        Sart3     7  5987   6041
        Olfr978   4  1452   1564
    ", header=T)


    df2 <- read.table(text="
        ID      chr Start   End     Xp
        S8411     4  989    1258   0.312
        S8411     4  1300   1800   0.144
        S8411     7  5641   6874   0.136
        S8413     4  1307   1360  -1.999
",header=T)

ожидаемый результат

 df3 <- read.table(" 
        Gene    chr   Start End   S8411  S8413
        Gm12724   4  1000   1105  0.312     0
        Zfhx2     4  1294   1369  0.144     -1.999
        Usp17lc   7  5004   5412    0       0
        Lingo1    7  5698   5789  0.136     0
        Sart3     7  5987   6041  0.136     0
        Olfr978   4  1452   1564   0.144    0
",header=T)

person beginner    schedule 01.05.2015    source источник
comment
@akrun. Я знаю findOverlaps, который дает перекрывающуюся область. из этого, как я могу создать новый набор данных, добавив уникальный (df2 $ ID) в качестве нового столбца в df1   -  person beginner    schedule 01.05.2015


Ответы (1)


Может быть это поможет

library(data.table)
setkey(setDT(df1),chr, Start, End)
setkey(setDT(df2), chr, Start, End)
res <- foverlaps(df1, df2,  type='any')[
   ( Start > i.Start| End> i.End)|is.na(Start)][,
   c('Start', 'End') := list(i.Start, i.End)][,7:8 := NULL]
dcast(res, ...~ID, value.var='Xp', fill=0)[, -7, with=FALSE]
#    chr Start  End    Gene S8411  S8413
#1:   4  1000 1105 Gm12724 0.312  0.000
#2:   4  1254 1369   Zfhx2 0.144 -1.999
#3:   4  1452 1564 Olfr978 0.144  0.000
#4:   7  5004 5412 Usp17lc 0.000  0.000
#5:   7  5698 5789  Lingo1 0.136  0.000
#6:   7  5987 6041   Sart3 0.136  0.000
person akrun    schedule 01.05.2015
comment
akrun @ получает сообщение об ошибке: повторяющиеся столбцы не допускаются в перекрывающихся соединениях. Это может измениться в будущем. - person beginner; 01.05.2015
comment
@beginner На основе предоставленного вами примера я не получаю никаких ошибок. Также проверьте, подходит ли вам решение genomicranges stackoverflow.com/questions/29648127/ - person akrun; 01.05.2015
comment
это сработало для примера. Но когда я попробовал это с моим исходным набором данных, он получил ошибку. - person beginner; 01.05.2015
comment
@beginner Я не уверен, в чем проблема, без примера, который дает ошибку. Можете попробовать решение по ссылке? - person akrun; 01.05.2015
comment
ссылка не дает решения по моему запросу. - person beginner; 02.05.2015
comment
@beginner mergeByOverlaps получает 7 строк вывода, и если вы используете dcast, он даст результат (из комментариев zx8754, я его не тестировал) - person akrun; 02.05.2015
comment
не могли бы вы сказать, какова функция: (Start ›i.Start | End› i.End) | is.na (Start)] [, c ('Start', 'End'): = list (i.Start, i.End)] [, 7: 8: = NULL] - person beginner; 03.05.2015
comment
@beginner После объединения мы получаем два дополнительных столбца, i.Start и i.End, я пытался разделить набор данных, так как некоторые гены имеют более одной строки - person akrun; 03.05.2015