【问题标题】:How can I keep data from one dataframe based on its appearance in a second dataframe?如何根据第二个数据帧中的外观保留一个数据帧中的数据?
【发布时间】:2021-08-08 16:29:25
【问题描述】:

我有 2 个包含相似数据的数据框。我知道数据框 2 中的数据在整个数据框 1 中重复出现。我想从数据框 1 中提取所有行,这些行的 ID 与数据框 2 中的一个匹配。 例如,数据框 1 的长度约为 40,000 行,其中包含蛋白质和 ID 列:

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

Dataframe 2 只有大约 10 行长,包含多列信息,但我只关心 ID 列。数据框 2:

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

我正在尝试生成一个数据框,其中包含来自数据框 1 的 ID,其中包含在数据框 2 中找到的 ID,同时也为了维护其行中的相关蛋白质。例如,在这里我希望输出为:

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

我尝试使用 ID 列使用intersect(),但是这总是返回一个空数据帧,filter() 和使用%in% 时也是如此。我也尝试过if(){} 声明,但是这些声明并没有返回我的结果。我不确定是否有一个简单的函数可以使用,或者我是否应该设置一个while() 循环。不过我没有这方面的经验,所以不知道从哪里开始。

任何建议都将不胜感激,我已经坚持了几个小时。提前谢谢你。

【问题讨论】:

  • 试试df1 %>% filter(ID %in% unique(df2$ID))
  • @coffeinjunky 非常感谢,我试试看!

标签: r dataframe filter intersect


【解决方案1】:

我们可以使用来自dplyr 包的inner_join

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))

【讨论】:

    【解决方案2】:

    只是为了说明我的评论:

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

    reprex package (v2.0.1) 于 2021-08-08 创建

    使用@TarJae 提供的数据框

    【讨论】:

      【解决方案3】:

      使用来自base Rsubset

       subset(df1, ID %in% df2$ID)
        Protein   ID
      1    4521 33PB
      2    6743 67TR
      3    6743 67TR
      

      【讨论】:

        【解决方案4】:

        使用merge 的基本 R 选项

        > merge(df1, df2)
            ID Protein Length      Family
        1 33PB    4521    700 transferase
        2 67TR    6743    478  Cytochrome
        3 67TR    6743    478  Cytochrome
        

        【讨论】:

          猜你喜欢
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-13
          • 1970-01-01
          • 2021-06-02
          • 1970-01-01
          • 2020-10-01
          相关资源
          最近更新 更多