2017-01-30 6 views
1

リストのリストを持っていて、N行1行(Nは引数として渡される数値)の行を追加する各行を意味します。つまり、行列内の行を結合する

1 2 3 
4 5 6 
7 8 9 
1 2 3 

有するN = 2が私にのみ3行(行 - N + 1)を有するマトリックス与える:N = 4の場合

1 2 3 4 5 6 7 8 9 // row1+row2+row3 
4 5 6 7 8 9 1 2 3 // row2+row3+row4 

:N = 3の場合

1 2 3 4 5 6 // row1+row2 
4 5 6 7 8 9 // row2+row3 
7 8 9 1 2 3 // row3+row4 

をそれは傷つくdはすべての行を連結して1行を返します。n> 4の場合は失敗します。

私は

はRでかなり簡単なコードは、(ここでR初心者)これを実行する必要があります:

ngram <- function(inp, window){ 
    rows <- dim(inp)[1] 
    cols <- dim(inp)[2] 
    resRows <- rows - window + 1 

    res <- c() 

    for(idx in 1:resRows) { 
     newRow <- inp[idx,] 
     for(ii in 1:(window-1)) { 
      newRow <- c(newRow, inp[idx+ii,]) 
     } 
     res <- rbind(res,newRow) 
    } 
    return(res) 
} 

iot <- read.csv("resources/data.csv") 
iot <- ngram(iot, 5) 

の問題は、私が思うに、私は例n=10のために置いた場合、非常に遅いc(newRow, inp[idx+ii,])、です。私がしたいことをするためのより良い方法はありますか?

答えて

4

、のは、私が正しくあなたのngram機能を理解していればあなたはcbind(N =あなたの例のように2)

cbind(a[1:(nrow(a) - 1),], a[2:nrow(a),]) 

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

を使って何があなたを得ることができます次の行列

a <- matrix(1:12, 4, 3, byrow = T) 

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

を想定してみましょうこのように書き換える必要があります

ngram <- function(inp, window){ 
    N <- nrow(inp) 
    cbind(inp[1:(N - window + 1),], inp[window:N,]) 
} 
+0

になり '追加されますwindow-1'行を各行に追加します。たとえば、 'window = 3'の場合、各行は3つの古い行を含んでいなければなりません。私はそれらをNgramと呼んでいます。なぜなら、NLPでは「私はパイが大好きです。」という言葉では「ウィンドウが3」のように「パイが好き」、「パイがとても好き」、「パイがとても好きです。それは似ています。私はそこに複数の行を渡すことができるか分からなかったが、c/cbingのチップのおかげで。 –

+0

あなたのヒントで私はこの 'c(inp [idx、]、t(inp [idx + 1:(idx + window-1)、]))')のようにすることができます 'しかし、私はまだすべての行それらのほとんど)、それはまだ長い時間がかかります。 –

+0

また、あなたのコードスニペットのおかげで、私は 'as.matrix'を使ってデータを行列に変更しなければならないと思っていました。それはすごくスピードアップし、問題はなくなりました。 :-) –

2

代替方法ではmatrixを使用して、個々の要素から新しい行列を作成します。

matSplat <- function(myMat, n) { 
    # get a list of the rows to combine 
    rows <- lapply(seq_len(nrow(myMat)-(n-1)), function(i) i:(i+n-1)) 
    # transpose the matrix 
    myMat.t <- t(myMat) 
    # build up the new matrix 
    matrix(unlist(lapply(rows, function(i) myMat.t[,i])), nrow(myMat)-(n-1), byrow=TRUE) 
} 

これは、私はこれが唯一の私が(もっと例を追加しました)何をしたいのか、窓= 2のために働くだろうと思い

matSplat(myMat, 2) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 2 3 4 5 6 
[2,] 4 5 6 7 8 9 
[3,] 7 8 9 1 2 3 
matSplat(myMat, 3) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 1 2 3 4 5 6 7 8 9 
[2,] 4 5 6 7 8 9 1 2 3 

データ

myMat <- matrix(c(1:9, 1:3), ncol=3, byrow = TRUE)