varias superponer studio lineas histogramas graficos grafico graficas dispersion r merge dataframe multiple-columns

superponer - valor de búsqueda de marco de datos en rango y columna de retorno diferente



superponer graficas en r (2)

Tengo dos marcos de datos y deseo usar el valor en uno ( DF1$pos ) para buscar a través de dos columnas en DF2 (DF2start, DF2end) y si está dentro de esos números, devuelva DF2$name

DF1

ID pos name chr 12 chr 542 chr 674

DF2

ID start end annot chr 1 200 a1 chr 201 432 a2 chr 540 1002 a3 chr 2000 2004 a4

entonces en este ejemplo me gustaría que DF1 se convierta

ID pos name chr 12 a1 chr 542 a3 chr 674 a3

He intentado usar merge e intersect pero no sé cómo usar una declaración if con una expresión lógica en ellas.

Los marcos de datos deben codificarse de la siguiente manera

DF1 <- data.frame(ID=c("chr","chr","chr"), pos=c(12,542,672), name=c(NA,NA,NA)) DF2 <- data.frame(ID=c("chr","chr","chr","chr"), start=c(1,201,540,200), end=c(200,432,1002,2004), annot=c("a1","a2","a3","a4"))


Quizás puedas usar foverlaps del paquete "data.table".

library(data.table) DT1 <- data.table(DF1) DT2 <- data.table(DF2) setkey(DT2, ID, start, end) DT1[, c("start", "end") := pos] ## I don''t know if there''s a way around this step... foverlaps(DT1, DT2) # ID start end annot pos i.start i.end # 1: chr 1 200 a1 12 12 12 # 2: chr 540 1002 a3 542 542 542 # 3: chr 540 1002 a3 674 674 674 foverlaps(DT1, DT2)[, c("ID", "pos", "annot"), with = FALSE] # ID pos annot # 1: chr 12 a1 # 2: chr 542 a3 # 3: chr 674 a3

Como menciona @Arun en los comentarios, también puede usar which = TRUE en foverlaps para extraer los valores relevantes:

foverlaps(DT1, DT2, which = TRUE) # xid yid # 1: 1 1 # 2: 2 3 # 3: 3 3 DT2$annot[foverlaps(DT1, DT2, which = TRUE)$yid] # [1] "a1" "a3" "a3"


También podría usar IRanges

source("http://bioconductor.org/biocLite.R") biocLite("IRanges") library(IRanges) DF1N <- with(DF1, IRanges(pos, pos)) DF2N <- with(DF2, IRanges(start, end)) DF1$name <- DF2$annot[subjectHits(findOverlaps(DF1N, DF2N))] DF1 # ID pos name #1 chr 12 a1 #2 chr 542 a3 #3 chr 674 a3