我正在研究转录组学项目,我有一个数据框,其中的列为#34; 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&#34; hugo_name&#34; (即基因名称)与EHK_list上的相匹配,并且DF表达值是> =来自EHK_minimum数据帧的截止值。也就是说,我想匹配元组(hugo_name,表达式),并确保样本的表达式值高于我列出的列表中&gt; = 9/10基因的截止值。有什么想法吗?
答案 0 :(得分:1)
在这种情况下,使用non-equi
的{{1}}联接可能是一个合适的选项,因为OP愿意检查data.table
在expression
中定义的cutoff
以上表达式的条件{1}}。
EHK_minimum
数据:根据OP提供的部分数据创建
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
答案 1 :(得分:1)
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