2016-04-05 19 views
0

böyle data.frame having: daha fazla genel olarakR kısmi data.frame çoğaltma

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 

bu temsil edilebilir aşağıdaki gibi - olan parametre recordsPerRow (örneğin eşittir) çıkışı olacaktır:

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 
0 o ve ben buna recordsPerRow satırları + sonraki i < sadece V_ değerleri ekleyen olarak

Yani i satır tooks.

işi yapan bir işlevi yarattı ama döngüler için dayanıyor iken (yaklaşık 300000 kayıtları ile data.frame birkaç dakika sürer) oldukça yavaş:

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)) 

Ben daha verimli bir çözüm olup olmadığını merak ?

+0

ilk 3 sütun son iki sıra dışarıda bırakarak arkasındaki mantık nedir? – mtoto

+0

@mtoto Sorunuzu doğru bir şekilde anlarsam, son iki satır data.frame'in sonu olduğunu varsayarak atlandı. 4. çıktı satırını oluşturmak için yeterli satır yok, çünkü 'h4 d4 m4 v41 v42 ... v61 v62 v63 v64' gibi görünmeli ve şimdi v61 v62 gibi değerlerle satır nr 6 var. Böylece çıktı data.frame uzunluğu * giriş data.frame uzunluğu olacaktır - recordsPerRow + 1 * – f1ames

cevap

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

Peki, biraz farklı çalışır. Her zaman "n" satırları ve "nrow (df) - n + 1" sütunlarını oluşturur. Yani eğer 10 satırlık bir df ve n = 3 ise, 3 satır ve 32 (8 * 4) sütun ile df yaratacağım ve 8 satır ve 12 (3 * 4) sütun ile df kullanmak istiyorum. – f1ames

+0

@ f1ames, yukarıdakileri anlarsanız, nasıl değiştirileceği açık olmalıdır – eddi