-1

r行と列を持ち、0 ~ の整数cを含む行列を考えてみましょう。次の例では、 、、および.vv-1r=4c=2v=6

L <- c(0,1,1,2,0,1,2,3)
(x <- matrix(L,nrow=4,ncol=2,byrow = TRUE))

 ## 0 1 
 ## 1 2 
 ## 0 1 
 ## 2 3

目標は、次のようにr*c(行)v列の発生率行列を生成することです。

  • 各行は元の行列の 1 つの要素に対応します (列優先順、つまり、この例では 4 行目が に対応しx[4,1]、5 行目が に対応しx[1,2]ます)
  • 各要素の上と下の「隣人」を見つけ、行列の上から下に (循環的に) ラップします。の各値の隣接要素の数を数えますv

たとえば、行列 ( x[1,1]) の最初の要素には、隣接する1(下) と2(「上」、つまり、列の下部にラップアラウンドがあります。したがって、行 1 の列 2 と列 3 に 1 を入力し、対応する要素に一致させます。0:(v-1)行の残りはゼロに設定されます。

  rownames  0  1  2  3  4  5            
  [1]       0  1  1  0  0  0

次の要素 ( x[2,1]) は0両側 (上下) にあるため、最初の列 (0 に対応) は 2 に設定され、残りの要素は 0 に等しくなります。

  [2]       2  0  0  0  0  0

上記の例の完全なマトリックスは次のとおりです。

  rownames  0  1  2  3  4  5            
  [1]       0  1  1  0  0  0
  [2]       2  0  0  0  0  0
  [3]       0  1  1  0  0  0
  [4]       2  0  0  0  0  0
  [5]       0  0  1  1  0  0
  [6]       0  2  0  0  0  0
  [7]       0  0  1  1  0  0  
  [8]       0  2  0  0  0  0 

行の合計はそれぞれ 2 です。

4

1 に答える 1

1
L =c(0,1,1,2,0,1,2,3)
x=matrix(L,nrow=4,ncol=2,byrow = TRUE)

これを行うためのよりクリーンな方法があるかもしれません:

wrapind <- function(i,n)
    ifelse((r <- i %% n) == 0, n, r)


n <- nrow(x)
v <- 6
incmat <- matrix(0,ncol=v,nrow=prod(dim(x)),
                 dimnames=list(NULL,0:(v-1)))
k <- 1
for (i in seq(ncol(x)))
    for (j in seq(nrow(x))) {
        cat(i,j,k,"\n")  ## unnecessary
        tt <- table(as.character(x[wrapind(c(j-1,j+1),n),i]))
        incmat[k,names(tt)] <- tt
        k <- k+1
    }
于 2013-02-12T19:18:15.893 に答える