当R中另一个向量中存在匹配值时,如何替换向量中的值?

时间:2017-07-12 17:18:44

标签: r vector match

我有一个看起来像这样的矢量,我们称之为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风格。我很感激任何意见。感谢。

1 个答案:

答案 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"