2017-07-12 10 views
0

私はこのようになりますベクトルを持っているが、gene_listそれを呼び出すことができます:Rの別のベクトルに一致する値が存在する場合、ベクトルの値を置き換えるにはどうすればよいですか?

hgnc_symbol  ensembl_gene_id 
Length:32057  Length:32057  
Class :character Class :character 
Mode :character Mode :character 

T1のヘッドは次のようになります:

"ENSMPUG00000000002" "ENSMPUG00000000003" "ENSMPUG00000000004" 
"ENSMPUG00000000005" "ENSMPUG00000000006" "ENSMPUG00000000007" 
.... 
32057 items. 

私も次のように持って、それがT1呼び出すことができます

hgnc_symbol ensembl_gene_id 
1    ENSMPUG00000000002 
2    ENSMPUG00000000003 
3    ENSMPUG00000000004 
4    ENSMPUG00000000005 
5    ENSMPUG00000000006 
6  MAP2K3 ENSMPUG00000000007 
.... 

私がしたいことは、t1の2番目の列に一致するものが見つかった場合、最初のベクトルの項目を置き換えることです。 hgnc_symbol列の多くの場合は空であることに注意してください。私は2番目の列に一致が見つかったときに置換したいだけで、最初の値に値が存在します。

だから、いくつかの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)] 

私はちょうど私が達成したいものを伝えようと、これらが正しくないことを知っているような。私はこれを手の平のようなやり方で成し遂げることができると知っていますが、私はまた、1行か2行でこれを行う簡単なRスタイルの方法があり、自分のRスタイルを調整しようとしていると確信しています。私は入力を感謝します。ありがとう。

答えて

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"  
+0

どうもありがとうございました。 !is.naの部分を[gene_list] == ""を検索するように変更しなければなりませんでしたが、そうでなければこれは素晴らしいことです。私はちょうど入れ子になったforループを試していた、笑、ひどくなった。この返答をありがとう、それは素晴らしい仕事です、私は何かを学んだ。 –

+1

助けてくれて嬉しいです - 例のコードでは、同じ問題を扱うためにデータを読むときに 'na.strings =" "'オプションを使いました。 – Damian

関連する問題