我有一个看起来像这样的矢量,我们称之为gene_list:
"ENSMPUG00000000002" "ENSMPUG00000000003" "ENSMPUG00000000004"
"ENSMPUG00000000005" "ENSMPUG00000000006" "ENSMPUG00000000007"
....
32057 items.
我还有以下内容,我们称之为t1:
hgnc_symbol ensembl_gene_id
Length:32057 Length:32057
Class :character Class :character
Mode :character Mode :character
t1的负责人看起来像:
hgnc_symbol ensembl_gene_id
1 ENSMPUG00000000002
2 ENSMPUG00000000003
3 ENSMPUG00000000004
4 ENSMPUG00000000005
5 ENSMPUG00000000006
6 MAP2K3 ENSMPUG00000000007
....
我想要做的是在t1的第二列中找到匹配项时替换第一个向量中的项目。请注意,hgnc_symbol列的许多情况都是空的。我只想在第二列中找到匹配时替换,并且第一列中存在值。
所以在某些r伪代码中,可能类似于
if t1$ensemble_gene_id[i] %in% gene_list
gene_list[i] = hgnc_symbol[i].
或
gene_list = gene_list[which(gene_list == t1$ensemble_gene_id)]
我知道这些不正确,只是想传达我想要实现的目标。我知道我可以通过循环的方式实现这一点,但我也相当确定有一种简单的R风格的方式在一两行中做这个并且我试图调整我的R风格。我很感激任何意见。感谢。
答案 0 :(得分:1)
您可以使用命名向量有条件地将旧值映射到新值。
gene_list <- c("ENSMPUG00000000002", "ENSMPUG00000000003", "ENSMPUG00000000004",
"ENSMPUG00000000005", "ENSMPUG00000000006", "ENSMPUG00000000007")
t1 <- read.csv(text='hgnc_symbol,ensembl_gene_id
,ENSMPUG00000000002
,ENSMPUG00000000003
,ENSMPUG00000000004
,ENSMPUG00000000005
,ENSMPUG00000000006
MAP2K3,ENSMPUG00000000007', stringsAsFactors = FALSE, na.strings = "")
# Create a named vector
lookup <- t1$hgnc_symbol[ !is.na(t1$hgnc_symbol) ] # values = new names
names(lookup) <- t1$ensembl_gene_id[ !is.na(t1$hgnc_symbol) ] # names = old names
# Use the named vector as a hash lookup
new_gene_list <- ifelse( is.na(lookup[gene_list]), gene_list, lookup[gene_list])
# Drop the names from the resulting vector
unname(new_gene_list)
结果:
> unname(new_gene_list)
[1] "ENSMPUG00000000002" "ENSMPUG00000000003" "ENSMPUG00000000004" "ENSMPUG00000000005" "ENSMPUG00000000006"
[6] "MAP2K3"