2016-10-17 20 views
1

jは、行列で構成されたリストです。リスト内の条件付き比率を計算します。

j <- list(matrix(1:12,3),matrix(50:61,3)) 

> j 
[[1]] 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

[[2]] 
    [,1] [,2] [,3] [,4] 
[1,] 50 53 56 59 
[2,] 51 54 57 60 
[3,] 52 55 58 61 

kもマトリックスで構成されたリストです。

k <- list(matrix(c(T,T,T,T,T,T,F,T,F,F,F,F),3,byrow = T), 
      matrix(c(T,F,T,F,F,T,T,T,F,F,F,F),3,byrow = T)) 

> k 
[[1]] 
     [,1] [,2] [,3] [,4] 
[1,] TRUE TRUE TRUE TRUE 
[2,] TRUE TRUE FALSE TRUE 
[3,] FALSE FALSE FALSE FALSE 

[[2]] 
     [,1] [,2] [,3] [,4] 
[1,] TRUE FALSE TRUE FALSE 
[2,] FALSE TRUE TRUE TRUE 
[3,] FALSE FALSE FALSE FALSE 

jk同じ寸法を有しています。各行で、jの値を合計で割って、TRUEjの合計で計算したいと考えています。

私は、例を用いてそれを説明してみましょう:jの第一の目的で

最初の行は1 4 7 10であり、すべての対応するj sが全て真であるので、kの対応する行は、TRUE TRUE TRUE TRUEので、の和"True" jは1 + 4 + 7 + 10 = 22なので、jの値を "True"の合計で割った値jは、つまり0.04545455 0.18181818 0.31818182 0.45454545です。

別の例:jの最初のオブジェクトの2行目は2 5 8 11あり、kの対応する行はTRUE TRUE FALSE TRUEので、j「真」の合計は18 = 2 + 5 + 11であるので、jの値"True"の合計で割ったj2/18 5/18 8/18 11/18、つまり0.1111111 0.2777778 0.4444444 0.6111111です。

だから最終的に予想される結果は次のとおりです。

[[1]] 
       [,1]  [,2]  [,3]  [,4] 
[1,] 0.04545455 0.18181818 0.31818182 0.45454545 
[2,] 0.1111111 0.2777778 0.4444444 0.6111111 
[3,]   Inf  Inf  Inf  Inf 

[[2]] 
       [,1]  [,2]  [,3]  [,4] 
[1,]  0.4716981 0.5000000 0.5283019 0.5566038 
[2,]  0.2982456 0.3157895 0.3333333 0.3508772 
[3,]   Inf  Inf  Inf  Inf 

私はMap(function(a,b) a[b], j, k)は、すべての真値を抽出できることを見つけるが、私は彼らが行で行sumする方法がわからない、

答えて

3

ますMaprowSumsを使用することができ、jkを同時にループするためにMapを使用し、jの行列にの行列を単純に乗算することによってrowSumsを使用して条件付き合計を計算することができます:

Map(function(x,y) x/rowSums(x*y), j, k) 

# [[1]] 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 0.04545455 0.1818182 0.3181818 0.4545455 
# [2,] 0.11111111 0.2777778 0.4444444 0.6111111 
# [3,]  Inf  Inf  Inf  Inf 
# 
# [[2]] 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 0.4716981 0.5000000 0.5283019 0.5566038 
# [2,] 0.2982456 0.3157895 0.3333333 0.3508772 
# [3,]  Inf  Inf  Inf  Inf 
+0

'X *は本当に輝かしい道をy'is。 'rowSums'は素晴らしいです。どうもありがとうございます! – lightsnail

1

はこれを試してみてください:

lapply(seq_len(length(j)), function(i) j[[i]]/rowSums(j[[i]]*k[[i]])) 

#[[1]] 
#   [,1]  [,2]  [,3]  [,4] 
#[1,] 0.04545455 0.1818182 0.3181818 0.4545455 
#[2,] 0.11111111 0.2777778 0.4444444 0.6111111 
#[3,]  Inf  Inf  Inf  Inf 

#[[2]] 
#   [,1]  [,2]  [,3]  [,4] 
#[1,] 0.4716981 0.5000000 0.5283019 0.5566038 
#[2,] 0.2982456 0.3157895 0.3333333 0.3508772 
#[3,]  Inf  Inf  Inf  Inf 
関連する問題