【问题标题】:subset of R dataframe matching two column criteria in 2nd dataframe匹配第二个数据帧中的两个列标准的 R 数据帧的子集
【发布时间】:2018-11-12 02:07:56
【问题描述】:

我正在处理一个转录组学项目,我有一个数据框,其中包含“SampleIDs”、“hugo_name”和“Expression”列。由于每个样本的基因名称很多,DF 有数千行。我正在尝试使用一组 10 个管家基因进行 QC 步骤,其中我消除了所有“样本 ID”,其中少于 9/10 的管家基因在截止值以上表达。基本上,我想获取 DF$hugo_name 中与 10 个基因列表匹配的所有基因,并且对于每个基因名称,检查其表达值以确保它高于我的截止值列表。

我的数据框包含 10 个管家基因和较低的截止表达值:

    EHK_list <- c("C1orf43", "CHMP2A", "GPI", "PSMB2", "PSMB4", "RAB7A", "REEP5", "SNRPD3", "VCP", "VPS29")
    EHK_minimum <- data_frame("hugo_name" = EHK_list, "expression" = c(2.3697, 3.4964, 2.0620, 2.1240, 4.3081, 8.3988, 1.4969, -0.0066, 2.5436, 5.2886))
      show(EHK_minimum)
     <chr>          <dbl>
     1 C1orf43       2.37  
     2 CHMP2A        3.50  
     3 GPI           2.06  
     4 PSMB2         2.12  
     5 PSMB4         4.31  
     6 RAB7A         8.40  
     7 REEP5         1.50  
     8 SNRPD3       -0.0066
     9 VCP           2.54  
    10 VPS29         5.29 

包含我所有数据的大型 DF 采用以下形式:

    Sample_ID      hugo_name     Expression     
    Sample_1       SNRPD3        6669.0
    Sample_1       ABCDEF        400.2
         ..
         ..
    Sample_2       RAB7A         1.75
    Sample_2       ZYXVU         9.4

我可以将我的 DF 子集到 EHK_list 上的基因中:

            QC_geneSubset <- DF[DF$hugo_name %in% EHK_list,]

              sample_ID     hugo_name     expression
              1: Sample1      RAB7A         1382.78
              2: Sample1      C1orf43       11.78
              3: Sample1      CHMP2A        75.5
                   .
                   .
             11: Sample2      RAB7A         33.3
             12: Sample2      C1orf43       12.1
             13: Sample2      CHMP2A        1500
                   .
                   .
             21: Sample3      RAB7A         66
             22: Sample3      C1orf43       1
             23: Sample3      CHMP2A        19
                   .
                   .

但我不知道如何只保留来自 DF 的行,其中 DF “hugo_name”(即基因名称)与 EHK_list 上的匹配,并且 DF 表达式值 >= EHK_minimum 数据帧的截止值.也就是说,我想匹配元组 (hugo_name, expression) 并确保样本的表达式值高于列表中我列出的 >=9/10 基因的截止值。有什么想法吗?

【问题讨论】:

  • 使用dplyr 你可以做到filter(df, hugo_name %in% EHK_list) %&gt;% mutate(flag = ifelse(expression&gt; threshold, "greater", "smaller"))。这应该让你足够接近你想去的地方。您可能需要加入您的数据和阈值
  • 你能提供一个小的dput你的真实数据或QC_geneSubset吗?

标签: r dataframe


【解决方案1】:

在这种情况下,使用data.tablenon-equi 连接可能是一个合适的选项,因为OP 愿意检查expression 大于EHK_minimum 中定义的cutoff 表达式的条件。

library(data.table)

setDT(EHK_minimum)
setDT(DF)

DF[EHK_minimum, on=.(hugo_name, expression >= expression), nomatch=0]

#    sample_ID hugo_name expression
# 1:   Sample1   C1orf43     2.3697
# 2:   Sample2   C1orf43     2.3697
# 3:   Sample3    CHMP2A     3.4964
# 4:   Sample1    CHMP2A     3.4964
# 5:   Sample2    CHMP2A     3.4964
# 6:   Sample2     RAB7A     8.3988
# 7:   Sample3     RAB7A     8.3988
# 8:   Sample1     RAB7A     8.3988

数据:根据 OP 提供的部分数据创建

EHK_list <- c("C1orf43", "CHMP2A", "GPI", "PSMB2", "PSMB4", 
           "RAB7A", "REEP5", "SNRPD3", "VCP", "VPS29")
EHK_minimum <- data_frame("hugo_name" = EHK_list, 
   "expression" = c(2.3697, 3.4964, 2.0620, 2.1240, 4.3081, 8.3988, 
                   1.4969, -0.0066, 2.5436, 5.2886))


DF <- read.table(text = 
"sample_ID     hugo_name     expression
1: Sample1      RAB7A         1382.78
2: Sample1      C1orf43       11.78
3: Sample1      CHMP2A        75.5
11: Sample2      RAB7A         33.3
12: Sample2      C1orf43       12.1
13: Sample2      CHMP2A        1500
21: Sample3      RAB7A         66
22: Sample3      C1orf43       1
23: Sample3      CHMP2A        19",
header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    data.table 解决方案很棒。为此,有一个dplyr。 请注意,我将关键 data.frame 中的变量名称更改为 threshold

         EHK_list <- c("C1orf43", "CHMP2A",
                       "GPI", "PSMB2", "PSMB4", "RAB7A",
                       "REEP5", "SNRPD3", "VCP", "VPS29")
    
         EHK_minimum <- data_frame("hugo_name" = EHK_list,
                                      "threshold" = c(2.3697, 3.4964, 2.0620,
         2.1240, 4.3081, 8.3988,
         1.4969, -0.0066, 2.5436, 5.2886))
    

    给定

        DF <- read.table(text = 
    "sample_ID     hugo_name     expression
    1: Sample1      RAB7A         1382.78
    2: Sample1      C1orf43       11.78
    3: Sample1      CHMP2A        75.5
    11: Sample2      RAB7A         33.3
    12: Sample2      C1orf43       12.1
    13: Sample2      CHMP2A        1500
    21: Sample3      RAB7A         66
    22: Sample3      C1orf43       1
    23: Sample3      CHMP2A        19",
    header = TRUE, stringsAsFactors = FALSE)
    

    我们加入并过滤

    DF %>% left_join(EHK_minimum) %>% filter(expression >= threshold)
    Joining, by = "hugo_name"
      sample_ID hugo_name expression threshold
    1   Sample1     RAB7A    1382.78    8.3988
    2   Sample1   C1orf43      11.78    2.3697
    3   Sample1    CHMP2A      75.50    3.4964
    4   Sample2     RAB7A      33.30    8.3988
    5   Sample2   C1orf43      12.10    2.3697
    6   Sample2    CHMP2A    1500.00    3.4964
    7   Sample3     RAB7A      66.00    8.3988
    8   Sample3    CHMP2A      19.00    3.4964
    

    【讨论】:

    • 好答案。几个小cmets。 OP 已将条件提到为expression value is &gt;= the cutoff。您可以更改您的代码以匹配相同。另一点可能是您没有使用 OP 提供的数据,因为在 OP 提供的数据中,threshold 列被称为expression。这些更改将提高您的答案的可用性。谢谢。
    猜你喜欢
    • 2020-10-09
    • 2021-03-10
    • 1970-01-01
    • 2018-04-28
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多