2017-06-06 4 views
1

Ich habe eine Matrix aus einer sehr langen Reihe von ganzen Zahlen zwischen 1 und 6. Ich möchte eine Ausgangsmatrix von der gleichen Länge wie die ursprüngliche Matrix und 6 Spalten (der Maximalwert in die ursprüngliche Matrix), wobei 1 n Mal der Wert der ersten angetroffenen ganzen Zahl in der Spalte des ganzzahligen Wertes wiederholt wird. (dh wenn der erste Wert 6 ist, würde er sich 1 x 6 mal in der 6. Spalte der Ausgabematrix wiederholen und dann würde der Wert in Zeile 7 der ursprünglichen Matrix für die nächste Wiederholungssequenz verwendet werden. Ich habe ein Beispiel gezeigt die unten. gibt es eine effiziente Möglichkeit, diese in R zu tun?Bedingte Sequenzwiederholung In R

Original Matrix   output Matrix      
    c1   c1 c2 c3 c4 c5 c6 
R1 1  R1 1 0 0 0 0 0 
R2 1  R2 1 0 0 0 0 0 
R3 3  R3 0 0 1 0 0 0 
R4 2  R4 0 0 1 0 0 0 
R5 6  R5 0 0 1 0 0 0 
R6 1  R6 1 0 0 0 0 0 
R7 1  R7 1 0 0 0 0 0 
R8 1  R8 1 0 0 0 0 0 
R9 1  R9 1 0 0 0 0 0 
R10 4  R10 0 0 0 1 0 0 
R11 4  R11 0 0 0 1 0 0 
R12 2  R12 0 0 0 1 0 0 
R13 1  R13 0 0 0 1 0 0 
R14 3  R14 0 0 1 0 0 0 
R15 1  R15 0 0 1 0 0 0 

ein weiteres Beispiel für die Eingangs- und Ausgangsmatrix meines obiges Beispiel klarer zu machen.

Input matrix   Output matrix               
    c1   1 2 3 4 5 6 
1 2  1 0 1 0 0 0 0 
2 2  2 0 1 0 0 0 0 
3 1  3 1 0 0 0 0 0 
4 6  4 0 0 0 0 0 1 
5 3  5 0 0 0 0 0 1 
6 4  6 0 0 0 0 0 1 
7 5  7 0 0 0 0 0 1 
8 4  8 0 0 0 0 0 1 
9 5  9 0 0 0 0 0 1 
10 4  10 0 0 0 1 0 0 
11 3  11 0 0 0 1 0 0 
12 3  12 0 0 0 1 0 0 
13 2  13 0 0 0 1 0 0 
14 3  14 0 0 1 0 0 0 
15 4  15 0 0 1 0 0 0 
16 5  16 0 0 1 0 0 0 
17 5  17 0 0 0 0 1 0 
18 5  18 0 0 0 0 1 0 
+0

Ich habe das zweite Beispiel bearbeitet. – user3690243

Antwort

1

Dies ist eine einfache Lösung, aber es funktioniert:

input_data <- c(1, 1, 3, 2, 6, 1, 1, 1, 1, 4, 4, 2, 1, 3, 1) 
result <- matrix(0, nrow = length(input_data), ncol = 6) 

counter <- 0 
for (i in 1:length(input_data)){ 
    if (counter == 0){ 
     counter <- set_value <- input_data[i]    
    } 

    result[i, set_value] <- 1 
    counter <- counter - 1 

} 

> cbind(input_data, result) 

[1,]   1 1 0 0 0 0 0 
[2,]   1 1 0 0 0 0 0 
[3,]   3 0 0 1 0 0 0 
[4,]   2 0 0 1 0 0 0 
[5,]   6 0 0 1 0 0 0 
[6,]   1 1 0 0 0 0 0 
[7,]   1 1 0 0 0 0 0 
[8,]   1 1 0 0 0 0 0 
[9,]   1 1 0 0 0 0 0 
[10,]   4 0 0 0 1 0 0 
[11,]   4 0 0 0 1 0 0 
[12,]   2 0 0 0 1 0 0 
[13,]   1 0 0 0 1 0 0 
[14,]   3 0 0 1 0 0 0 
[15,]   1 0 0 1 0 0 0 
+1

Das ist wirklich toll, genau was ich wollte. Vielen Dank fopr die Antwort zu liefern. – user3690243

+0

Gut zu helfen! :) – User2321