2017-06-08 12 views
1

私はRで行列を持って、ここで小さな例である私も、ベクトルを持っている検索頻度が

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 3 9 3 5 10 4 
[2,] 4 10 2 7 2 1 
[3,] 5 6 6 8 6 10 
[4,] 7 5 10 3 1 7 
[5,] 2 1 5 10 9 3 

v整数は、v<-c(1,3,6)であり、その要素は上記の行列matに理論的に現れることができます。私が探しています何

vの各要素が列あたりmatに表示された回数の概要です。現在の例では、この概要は

1: 0 1 0 0 1 1 
3: 1 0 1 1 0 1 
6: 0 1 1 0 1 0 

であることはfor -loopsとif -statementsを使用してこれを行うにはかなり簡単ですが、このソリューションは非常にきれいではありません。

これを行う専門的な方法はありますか? sapplyを使用して

答えて

1

一つのオプション:

tableを使用して
t(sapply(v, function(a) colSums(mat==a))) 

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

もちろん 'rownames(RES)<などのrownames設定することができます - as.character(V)' 'res'は、得られる行列です。 – 989

1

table(mat[mat %in% v], col(mat)[mat %in% v]) 

# 1 2 3 4 5 6 
# 1 0 1 0 0 1 1 
# 3 1 0 1 1 0 1 
# 6 0 1 1 0 1 0 

欠点はv内のすべての値ではないとの列が報告されませんです。

1

data.frameのsapplyを使用すると、列を繰り返し処理します。

setNames(object = as.data.frame(sapply(v, function(a) 
     sapply(as.data.frame(mat), function(b) 
          sum(a %in% b)))), nm = v) 
# 1 3 6 
#V1 0 1 0 
#V2 1 0 1 
#V3 0 1 1 
#V4 0 1 0 
#V5 1 0 1 
#V6 1 1 0 
関連する問題