2017-02-06 4 views
0

Iのような、いずれかの含有1, -1 or 0値遺伝子マトリックスによってサンプル、あるデータフレームmatを有する:データフレーム内の列名を別のデータフレームと照合して値を取得し、その値を使用して追加の値を計算する方法を教えてください。

GeneName  Score 
Gene1   0.5 
Gene2   0.3 
Gene3   0.2 
Gene4   0.6 
Gene5   0.7 
Gene6   0.1 
Gene7   0.4 

  Gene1 Gene2  Gene5  Gene7 
Sample1 1  0   -1   1 
Sample2 0  -1   0   1 
Sample3 -1  0   1   1 
Sample4 1  1   0   0 

別のデータフレームをscoreのようなすべての遺伝子についての対応するスコアを含み、

私がしようとしているのは、式に基づいていくつかのスコアを含むmatの新しい列を取得することです。式は、各列について

Gene1 + mat[1,2]mat[1,1] *スコア* Gene2 + mat[1,3]のスコア* Gene7Gene5 + mat[1,4] *値のスコア。 matのすべての行で同じです。

例えば、与えられたデータの最初の行のために、Sample1についての結果は次のようになります。これはダム問題である

(1*0.5) + (0*0.3) + (-1*0.7) + (1*0.4) = 0.2 

申し訳ありません場合。私はRの新人で、まだ%in%matchmergeのようなものに取り組んでいます。現在の状態であなたのデータを考えると

データ

mat <- structure(list(Gene1 = c("1", "0", "-1", "1"), Gene2 = c("0", "-1", "0", "1"), Gene5 = c("-1", "0", "1", "0"), Gene7 = c("1", "1", "1", "0")), class = "data.frame", row.names = c("Sample1", "Sample2", "Sample3", "Sample4")) 

score <- structure(list(GeneName = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5", "Gene6", "Gene7"), Score = c("0.5", "0.3", "0.2", "0.6", "0.7", "0.1", "0.4")), class = "data.frame", row.names = c(NA, -7L)) 

答えて

1

は、次の操作を実行できます。

# get matching values 
myVals <- as.numeric(score$Score[match(names(mat), score$GeneName, nomatch=FALSE)]) 
# Get the dot product for each row 
apply(mat, 1, function(x) sum(as.numeric(x) * myVals)) 
Sample1 Sample2 Sample3 Sample4 
    0.2  0.1  0.6  0.8 

最初の行がに対応scoreの位置を選択するようにmatchを使用していますマットの列名。対応する値は[で抽出されます。 2行目では、applyは、抽出された値でマットの各行のドット積を計算します。

数値データは文字として格納されるため、計算のためにベクターを強制的に変換するのにas.numericを使用します。


データの構造を考えると、行と列の名前を持つ数値行列として保存する方がよいでしょう。 (ループなし - 関数を適用)ここで

# turn mat into a matrix: 
mat2 <- sapply(mat, as.numeric) 

# dot product of each row: matrix multiplication 
mat2 %*% myVals 
    [,1] 
[1,] 0.2 
[2,] 0.1 
[3,] 0.6 
[4,] 0.8 
+0

!完璧に動作します!私は私が推測するこの 'apply'関数についてもっと研究する必要があります。非常に便利で速いのようです。 –

+0

'apply'は通常、他の多くのメソッドよりも低速ですが、行列(またはdata.frames)に対して行操作を行う必要がある場合に便利です。この特定の問題に対する最速の解決策は、特に行列から始める場合は、超高速Fortranライブラリを使用するため、行列の乗算方法になります。 – lmo

1

が、これはかなり効率的に成し遂げるための一つの方法であるdplyr/tidyrを使用して:

library(dplyr) 
library(tidyr) 

mat$Sample <- row.names(mat) 
row.names(mat) <- NULL 

mat %>% 
    gather(GeneName, Value, -Sample) %>% 
    inner_join(., score) %>% 
    group_by(Sample) %>% summarise(score = sum(Value * Score)) 

出力は次のとおりです。おかげで@Imo

# A tibble: 4 × 2 
    Sample score 
    <chr> <dbl> 
1 Sample1 0.2 
2 Sample2 0.1 
3 Sample3 0.6 
4 Sample4 0.8 
+0

こんにちは!ここで何が起こっているのか正確に把握しているわけではありません。コードを説明できますか?ありがとう! –

+0

'gather'は、遺伝子名及び値を持つ長いデータフレームを作成' inner_join'は、遺伝子名で共通の行を保持し、各遺伝子名に対応するスコア列にもたらし、そして 'GROUP_BY/summarise'値の集合積を行うあたりスコアサンプル。個々のコードを実行して、何が起こっているのかを見ることができます。 – Gopala

関連する問題