2017-11-01 7 views
0

から特定の文字列の出現をカウントB/B "を各セルから取り出し、新しいマトリックスに入れる。 「A/A」が検出された場合、カウントは2であり、「B/B」が0であった場合、および「B/B」が0であった場合には、カウントはマトリックスのそのセル内で1になる。は、私はこのようになります行列を持つ行列

だから、基本的には、新しい行列は次のようになります。

[1] 1 2 1 1 0 0 0 0 2 1 ... so on 
[16] 0 1 0 0 1 0 0 1 1 1 ... 

私はそうすることの試みで 行列になるだろう、私のコードは次のようになります。

count <- 0 
for(i in dim(matrix1)[1]) 
{ 
    if(snp1 == "B/A") 
    count = count + 1 
} 
print(count) 

しかし、私はこの出力を取得エラー:

Warning message: 
In if (snp1 == "B/A") count = count + 1 : 
    the condition has length > 1 and only the first element will be used 
+0

おそらくRチュートリアルを参照してください。あなたのループの本体の中で 'i'の上に、あなたはどこかで' i'を使うべきです、 'snp1 [i、]'のように。また、Rのfor-loop構文に従って、seq_len(dim(matrix1)[1])に 'iが必要です。 – Frank

+0

質問とタイトルを編集する必要があります。あなたがしたいことは、文字列を数えずに文字列を代入することです。また、サンプル行列はベクトルのように見えます。 – neilfws

答えて

5

たぶん、このようなものは動作します:

# Generate data 
alleles <- c("B/B", "B/A", "A/A") 
genotype <- matrix(sample(alleles, 20, replace = TRUE), 5) 

#  [,1] [,2] [,3] [,4] 
# [1,] "B/B" "A/A" "B/A" "A/A" 
# [2,] "B/B" "A/A" "A/A" "B/B" 
# [3,] "A/A" "A/A" "B/B" "B/A" 
# [4,] "B/A" "B/B" "B/A" "A/A" 
# [5,] "B/B" "B/A" "B/A" "B/A" 

genotypeQuant <- matrix(as.numeric(factor(genotype, levels = alleles)) - 1, 
         nrow = nrow(genotype)) 

#  [,1] [,2] [,3] [,4] 
# [1,] 0 2 1 2 
# [2,] 0 2 2 0 
# [3,] 2 2 0 1 
# [4,] 1 0 1 2 
# [5,] 0 1 1 1 

まず要因(ベクトルallelesで提供さ順)にあなたのマトリックス(対立遺伝子/ SNPを)変換して数値にこれらの要因を変換します。

+0

@ KatZeeあなたの問題を解決した場合、解決策を受け入れることができますか? – PoGibas

-1

"A/A"、 "B/A" と "B/B" を使用して、ベクターがdf呼ばれると仮定すると、私はちょうど使用します。

df[df=="B/B"] <- 0 
df[df=="B/A"] <- 1 
df[df=="A/A"] <- 2 
df <- as.numeric(df) 

限り、あなたは本当にこれらのみを持っているとして、 3つのユニークな値、このソリューションはトリックを行うだろう。

関連する問題