Как я могу сохранить данные из одного фрейма данных на основе их появления во втором фрейме данных?

avatar
Molly K
8 августа 2021 в 16:29
43
4
1

У меня есть 2 фрейма данных, содержащих похожие данные. Я точно знаю, что данные из кадра данных 2 повторяются во всем кадре данных 1. Я хочу извлечь все строки из кадра данных 1, у которых есть идентификатор, соответствующий одному из тех, которые видны в кадре данных 2. Например, кадр данных 1 имеет длину около 40 000 строк со столбцом белков и идентификаторов:

.
  Protein |    ID|
# 4521     33PB
# 6743     67TR
# 6743     67TR
# 6743     63YH
# 5571     84RW

Кадр данных 2 имеет длину всего около 10 строк с несколькими столбцами информации, но меня интересует только столбец идентификатора. Кадр данных 2:

Length |  Family      | ID 
# 700      transferase   33PB
# 478      Cytochrome    67TR
# 341      Cytochrome    23FD
# 902      Methyl        00QA
# 554      p450          76LK

Я пытаюсь создать кадр данных, содержащий идентификаторы из кадра данных 1, которые содержат идентификаторы, найденные в кадре данных 2, а также для сохранения связанного белка из их строки. Например, здесь я бы хотел, чтобы вывод был:

Protein  |  ID
# 4521       33PB
# 6743       67TR
# 6743       67TR

Я пытался использовать intersect() с использованием столбцов ID, однако это всегда возвращает пустой фрейм данных, то же самое касается filter() и при использовании %in%. Я также пробовал операторы if(){}, однако они снова не возвращают мои результаты. Я не уверен, есть ли простая функция, которую я мог бы использовать, или мне следует настроить цикл while(). У меня нет опыта в этом, поэтому я не знаю, с чего начать.

Буду признателен за любой совет, я застрял на этом несколько часов. Заранее спасибо.

Источник
coffeinjunky
8 августа 2021 в 16:31
0

Попробуйте df1 %>% filter(ID %in% unique(df2$ID))

Molly K
8 августа 2021 в 16:36
0

@coffeinjunky большое спасибо, попробую!

Ответы (4)

avatar
ThomasIsCoding
8 августа 2021 в 19:57
1

Базовый вариант R с использованием merge

> merge(df1, df2)
    ID Protein Length      Family
1 33PB    4521    700 transferase
2 67TR    6743    478  Cytochrome
3 67TR    6743    478  Cytochrome
avatar
akrun
8 августа 2021 в 19:04
2

Использование subset из base R

 subset(df1, ID %in% df2$ID)
  Protein   ID
1    4521 33PB
2    6743 67TR
3    6743 67TR
avatar
coffeinjunky
8 августа 2021 в 16:50
3

И просто для иллюстрации моего комментария:

library(tidyverse)

df1 %>% filter(ID %in% unique(df2$ID))
#>   Protein   ID
#> 1    4521 33PB
#> 2    6743 67TR
#> 3    6743 67TR

Создано 08 августа 2021 г. с помощью reprex package (v2.0.1)

Использование фреймов данных, предоставленных @TarJae

avatar
TarJae
8 августа 2021 в 16:38
3

Мы могли бы использовать inner_join из пакета dplyr:

library(dplyr)
df1 %>% 
    inner_join(df2, by="ID")

Вывод:

  Protein   ID Length      Family
1    4521 33PB    700 transferase
2    6743 67TR    478  Cytochrome
3    6743 67TR    478  Cytochrome

Данные:

df1 <- structure(list(Protein = c(4521L, 6743L, 6743L, 6743L, 5571L), 
ID = c("33PB", "67TR", "67TR", "63YH", "84RW")), class = "data.frame", row.names = c(NA, 
-5L))

df2 <- structure(list(Length = c(700L, 478L, 341L, 902L, 554L), Family = c("transferase", 
"Cytochrome", "Cytochrome", "Methyl", "p450"), ID = c("33PB", 
"67TR", "23FD", "00QA", "76LK")), class = "data.frame", row.names = c(NA, 
-5L))