2016-07-24 9 views
1

I gefragt, ob es ist möglich, jede ganze Zahl in einem Satz von Zahlen zu String und in eine Übergangsmatrix-Transformation, beispielsweiseAufspalten ganze Zahlen und Umwandeln in Matrix

data<-c(11,123,142,1423,1234,12) 

was ich tun möchte ist aufzuzuspalten jede Ganzzahl in den Daten (berücksichtigt nur die ersten beiden Elemente in dem Datensatz), das erste Element ist 1,1, das zweite Element ist 1,2,3 .... und wandelt es in die Matrix e um, g 1,1 wird sein 1 zu 1, 1,2 ist 1 zu 2 und 2,3 ist 2 zu 3.

1 2 3 4 5 
1 1 1 0 0 0 
2 0 0 1 0 0 
3 0 0 0 0 0 
4 0 0 0 0 0 
5 0 0 0 0 0 

Meine ma Trix wird niemals 5x5 überschreiten. Unten ist, was ich getan habe, was funktioniert, aber es ist wirklich sehr langweilig.

data2<-as.matrix(as.character(data)) 
for(i in 1:nrow(data2)) { 
values<-strsplit(data2,"") 
} 
values2<-t(sapply(values, '[', 1:max(sapply(values, length)))) 
values2[is.na(values2)]<-0 
values3<-apply(values2,2,as.numeric) 
from1to1<-0 
from1to2<-0 
from1to3<-0 
from1to4<-0 
from1to5<-0 
from2to1<-0 
from2to2<-0 
from2to3<-0 
from2to4<-0 
... 
from5to4<-0 
from5to5<-0 
for(i in 1:nrow(values3)){ 
    for(j in 1:(ncol(values3)-1)) 
if (((values3[i,j]==1)&(values3[i,j+1]==1))){ 
    from1to1<-from1to1 + 1 
}else{ 
    if (((values3[i,j]==1)&(values3[i,j+1]==2))){ 
    from1to2<-from1to2 + 1 
    }else{ 
    if (((values3[i,j]==1)&(values3[i,j+1]==3))){ 
     from1to3<-from1to3 + 1 
    }else{ 
     if (((values3[i,j]==1)&(values3[i,j+1]==4))){ 
     from1to4<-from1to4 + 1 
     }else{ 
     if (((values3[i,j]==1)&(values3[i,j+1]==5))){ 
      from1to5<-from1to5 + 1 
     }else{ 
      if (((values3[i,j]==1)&(values3[i,j+1]==1))){ 
      from1to1<-from1to1 + 1 
      }else{.....continues through all other from2to1...from5to5`` 

Ich stelle dann jede einzelne Zahl in eine 5x5-Matrix.

Dies ist offensichtlich langwierig und lang und lächerlich. Gibt es da überhaupt eine Verkürzung? Irgendwelche Vorschläge werden geschätzt.

+0

Wenn ich das richtig verstehe, ist der gebräuchlichste Ansatz in solchen Fällen, eine zweispaltige "Matrix" zu erstellen, die die [row, col] Indizes von Werten speichert, die Sie in Ihre 5x5 "Matrix" einfügen wollen. I.e. build 'do.call (rbind, lapply (strsplit (as.zeichen (daten)," "), funktion (x) {v = as.numerisch (x); cbind (v [-länge (x)), v [ -1])})) '. Dann sehen Sie '? Xtabs' oder, noch besser, die vorherige" Matrix "als, sagen wir,' tmp', verwenden Sie Matrix :: sparseMatrix (i = tmp [, 1], j = tmp [, 2], x = 1L, dims = c (5, 5), dimnames = Liste (1: 5, 1: 5)), um eine dünne Matrix zu verwenden. –

+0

Brauchen Sie die umgekehrten Kombinationen? Zum Beispiel für '12' wollen Sie die Matrix zu einem füllen 'mat [1, 2]' oder muss es auch füllen mat [2, 1] '? – dayne

Antwort

1

Hier ist eine Option, präsentiert hier geleitet, um einfach zu folgen:

library(magrittr) # for the pipe 

# initialize a matrix of zeros 
mat <- matrix(0, 5, 5) 

# split each element into individual digits 
strsplit(as.character(data), '') %>% 
    # turn list elements back to integers 
    lapply(as.integer) %>% 
    # make a 2 column matrix of each digit paired with the previous digit 
    lapply(function(x){matrix(c(x[-length(x)], x[-1]), ncol = 2)}) %>% 
    # reduce list to a single 2-column matrix 
    do.call(rbind, .) %>% 
    # for each row, add 1 to the element of mat they subset 
    apply(1, function(x){mat[x[1], x[2]] <<- mat[x[1], x[2]] + 1; x}) 
# output is the transpose of the matrix; the real results are stored in mat 
##  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
## [1,] 1 1 2 1 4 1 4 2 1  2  3  1 
## [2,] 1 2 3 4 2 4 2 3 2  3  4  2 

mat 
##  [,1] [,2] [,3] [,4] [,5] 
## [1,] 1 3 0 2 0 
## [2,] 0 0 3 0 0 
## [3,] 0 0 0 1 0 
## [4,] 0 2 0 0 0 
## [5,] 0 0 0 0 0 

Alternativ, wenn Sie xtabs möchten, wie durch alexis_laz vorgeschlagen, ersetzen Sie die letzte Zeile mit xtabs(formula = ~ .[,1] + .[,2]) statt mat zu verwenden.

Sie könnten auch auschecken the permutations package, was von dem, was ich sagen kann, scheint für die Arbeit mit dieser Art von Daten zu sein, obwohl es etwas High-Level ist.

+0

Dies sieht interessant aus, jedoch zeigt die Matrix eine eindeutige Zählung, z. B. zeigt sie 1 Zählung von 1 bis 2, während es 3 Zählungen von 1 bis 2 in der Datenmenge gibt. Gibt es eine Möglichkeit, die Anzahl der Zählungen anstelle der eindeutigen Anzahl anzuzeigen? genossen die Pfeife, wusste nicht, dass es existiert, wird es in Zukunft öfter verwenden. – Donkeykongy

+0

Aktualisiert; Sie mussten wirklich nur den "eindeutigen" Anruf löschen und einen hinzufügen, anstatt ihn zuzuweisen. Die 'xtabs' -Version funktioniert automatisch so, ohne' unique', wie es ist. – alistaire