2016-07-09 3 views
1

"J"または "N"のいずれかに等しい値を含む行列を持っています。これらの値は、3,2、または1のブロックに表示され、値なしで区切られます。私は3,2と1のブロックが何度も出現することを数えたいと思う。私はJとNを1で置き換えた後、次の関数に従ってそれを数えればそれを行うことができます。しかし、あなたはそれが行列JとNとの間のおかげセルがテキストに等しいときの出現回数をカウントする

を分離するためにどのように行うことができます。

 t1 t2 t3 t4 t5 t6 t7 
[1,] 0 0 0 0 J J 0 
[2,] 0 0 N N 0 0 N 
[3,] J J J 0 0 0 0 
[4,] 0 0 N N N 0 0 

(チャットの誰かからの)コードJ

n1 <- 2 
n2 <- 3 
res <- t(apply(Calendar, "J", FUN=function(x) { 
     x1 <- with(rle(x), lengths[!!values]) 
     c(sum(x1==n1), sum(x1==n2)) 
})) 
colnames(res) <- paste0("count", c(11, 111)) 
res 

ためまあ、それはありません最終的には行列を持っていたいと思います(初期行列に従います)

J3 J2 J1 N3 N2 N1 
1 2 0 1 1 1 

明確化:

マトリックス:これはカレンダーで、1-7は、この潜在的なマトリックスに所望の答えがどうなるか曜日、であるという仮定の下で

 t1 t2 t3 t4 t5 t6 t7 
[1,] 0 0 0 0 0 J J 
[2,] J 0 N N 0 0 N 
[3,] J J J 0 0 0 N 
[4,] N 0 N N N 0 0 
+1

J2には2、J1にはどのようにして得ましたか? – akrun

答えて

1

我々はrle

を使用することができます
lst1 <- lapply(c("J", "N"), function(nm) t(apply(Calendar == nm, 1, 
      FUN = function(x) { 
      x1 <- with(rle(x), lengths[values]) 
      table(factor(x1, levels=1:3))}))) 
`row.names<-`(t(sapply(lst1, colSums)), c("J", "N")) 
+0

最後に私を助けてくれた人もありがとう。私は別の質問があります。私は柱を列単位で実行したいが、その機能が最初の列に最初に適用され、次に2番目に適用されることが非常に重要です。最高のソリューションを適用するか、ループが良いです(私はすべてのカラムにオンスで関数を適用したくないので)。助けてくださりありがとうございます。 – richpiana

+0

@branchwarren最初の列出力が各実行で2番目の列に影響する場合、 'for'ループを使用するほうが良いかもしれません。 – akrun

関連する問題