2016-04-05 8 views
0

私はこのようなdata.frame抱えている:R部分data.frame複製

h d m v1  v2  v3  v4 
0 4 0 0.8556 0.8556 0.8554 0.8556 
0 4 0 0.8568 0.8568 0.8566 0.8568 
1 4 0 0.8602 0.8602 0.8602 0.8602 
1 4 0 0.8568 0.8568 0.8528 0.8530 
2 4 0 0.8566 0.8568 0.8566 0.8568 

より一般的に、それはのように表すことができる:私は変換する方法を探しています

h1 d1 m1 v11 v12 v13 v14 
h2 d2 m2 v21 v22 v23 v24 
h3 d3 m3 v31 v32 v33 v34 
h4 d4 m4 v41 v42 v43 v44 
h5 d5 m5 v51 v52 v53 v54 

をその次のよう - 出力は次のようになり、パラメータrecordsPerRow(例えばに等しい)を有する:

h1 d1 m1 v11 v12 v13 v14 v21 v22 v23 v24 v31 v32 v33 v34 
h2 d2 m2 v21 v22 v23 v24 v31 v32 v33 v34 v41 v42 v43 v44 
h3 d3 m3 v31 v32 v33 v34 v41 v42 v43 v44 v51 v52 v53 v54 

それだけV_値であり、追加としてだから、私はそれにrecordsPerRow行を+ <次からI行をtooks。

(周り300000レコードをdata.frameは数分かかります)私は仕事をして機能を作成しましたが、それはループのために基づいている間、それはかなり遅いです:

rows <- nrow(data) 
    cols <- ncol(data) 

    rowLength <- 3 + 4 * recordsPerRow 
    resultedRows <- rows - recordsPerRow + 1 
    resultLength <- resultedRows 
    result <- numeric(resultedRows * rowLength) 

    for (i in 1:resultLength) { 
    for(j in 1:recordsPerRow) { 
     if (j == 1) { 
     startIndex <- 1 + (i - 1) * rowLength 
     endIndex <- startIndex + 7 - 1 # + 7 -> row length; - 1 -> end is inclusive 
     result[startIndex:endIndex] <- as.numeric(data[i + j - 1,2:cols]) 

     } else { 
     startIndex <- lastIndex 
     endIndex <- startIndex + 4 - 1 # + 4 -> row length; - 1 -> end is inclusive 
     result[startIndex:endIndex] <- as.numeric(data[i + j - 1,5:cols]) 
     } 
     lastIndex <- endIndex + 1 
    } 

    } 
    result <- as.data.frame(matrix(result, ncol = rowLength, byrow = T)) 

より効率的な解決策があるかどうか、私は疑問に思います?

+0

最初の3つの列の最後の2つの行を削除するロジックは何ですか? – mtoto

+0

@mtoto質問を正しく理解していれば、最後の2行は省略されてdata.frameの最後であると仮定します。 'h4 d4 m4 v41 v42 ... v61 v62 v63 v64'のようになり、' v61 v62'のような値を持つ行nr 6があるので、4行目の出力行を作成するのに十分な行がありません。したがって、出力data.frameの長さは入力データの長さになります。frame - recordsPerRow + 1 * – f1ames

答えて

0
n = 3 

do.call(cbind, lapply(1:(nrow(df)-n+1), function(i) df[i:(i+n-1), 4:7])) 
# V4 V5 V6 V7 V4 V5 V6 V7 V4 V5 V6 V7 
#1 v11 v12 v13 v14 v21 v22 v23 v24 v31 v32 v33 v34 
#2 v21 v22 v23 v24 v31 v32 v33 v34 v41 v42 v43 v44 
#3 v31 v32 v33 v34 v41 v42 v43 v44 v51 v52 v53 v54 
+0

これは少し違っています。常に 'n'行と' nrow(df) - n + 1'列を作成します。だから私は8行と12(3 * 4)の列とdfを持っていると思いますが、私は10行とn = 3とdfを持っている場合、3行と32(8 * 4)列のdfを作成します。 – f1ames

+0

@ f1amesあなたが上記を理解している場合は、それをどのように変更するのかを明らかにする必要があります – eddi

関連する問題