Сохранять строку в кадре данных, только если он присутствует в другом - PullRequest
2 голосов
/ 28 апреля 2020

Здравствуйте, у меня есть 2 кадра данных

DF1

query   Qstart  Qend    Col3    Col4
ABEL1   1   50  A   B
ABEL2   2   51  P   O
ABEL3   3   52  S   E
ABEL4   4   53  Q   L
ABEL5   5   54  A   J

и DF2

seqnames    start   end
ABEL2   2   51
ABEL3   3   52
ABEL5   5   54

, и я хотел бы сохранить в строке DF только при запуске seqnames, start и конец соответствуют DF2

Здесь хранятся только Abel2,3 и 5, и я получаю:

NEW_DF

query   Qstart  Qend    Col3    Col4
ABEL2   2   51  P   O
ABEL3   3   52  S   E
ABEL5   5   54  A   J

Спасибо за вашу помощь :)

Ответы [ 3 ]

5 голосов
/ 28 апреля 2020

Вы хотите внутреннее объединение с похожими именами столбцов:

merge(x = df1, y = df2, by.x = c("query", "Qstart", "Qend"), 
      by.y = c("seqnames", "start", "end"))

  query Qstart Qend Col3 Col4
1 ABEL2      2   51    P    O
2 ABEL3      3   52    S    E
3 ABEL5      5   54    A    J
3 голосов
/ 28 апреля 2020

Использование inner_join

library(dplyr)
inner_join(DF1, DF2, by = c('query' = 'seqnames', 
       'Qstart' = 'start', 'Qend' = 'end'))
#  query Qstart Qend Col3 Col4
#1 ABEL2      2   51    P    O
#2 ABEL3      3   52    S    E
#3 ABEL5      5   54    A    J

данных

DF1 <- structure(list(query = c("ABEL1", "ABEL2", "ABEL3", "ABEL4", 
"ABEL5"), Qstart = 1:5, Qend = 50:54, Col3 = c("A", "P", "S", 
"Q", "A"), Col4 = c("B", "O", "E", "L", "J")), class = "data.frame", 
row.names = c(NA, 
-5L))

DF2 <- structure(list(seqnames = c("ABEL2", "ABEL3", "ABEL5"), start = c(2L, 
3L, 5L), end = c(51L, 52L, 54L)), class = "data.frame", row.names = c(NA, 
-3L))
2 голосов
/ 28 апреля 2020

Другое базовое решение R

DF1[match(data.frame(t(DF2),stringsAsFactors = FALSE),data.frame(t(DF1[1:3]),stringsAsFactors = FALSE)),]

, которое дает

  query Qstart Qend Col3 Col4
2 ABEL2      2   51    P    O
3 ABEL3      3   52    S    E
5 ABEL5      5   54    A    J
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...