2016-05-26 3 views
1

Ich habe eine große Matrix mit Unternehmen als Zeilennamen, Monate als Spaltennamen und Daten für jedes der Elemente. Testdaten unten:In R, mit Ergebnissen von RLE (Run Length Encoding) einschließlich benannter Zeile und Spaltenüberschriften

testmatrix<-matrix(c(1,0,0,0,10,5,5,5,5,5,2,2,0,0,0,0,0,1,1,1),nrow=4,ncol=5,byrow=TRUE) 
colnames(testmatrix)<-c("Jan","Feb","Mar","Apr","May") 
rownames(testmatrix)<-c("Company1","Company2","Company3","Company4") 
progression<-apply(testmatrix,1,rle) 
progression 

Die Progression Objekt der Ausgang der RLE-Funktion über jede der Zeilen der Matrix angelegt ist. Das Ergebnis ist eine Liste mit zwei Elementen der Klasse 'rle'. Ich möchte:

  1. Verstehen Sie, wie Ausgabe (in R) eine 4x3 (Zeile von Spalte) Matrix von Company1 wie folgt:

enter image description here

Daher kämpfen ich zu verstehen, wie mit dem Ausgang zur Verfügung gestellt von progression

  1. Export progression nach Excel zur weiteren Analyse (vorzugsweise im Format in (1) oben (inkl beschäftigen uding Spalte und Zeilenköpfe (in der Listenausgabe werden sie bezeichnet als: attr (*, "Namen")).

Ihre Hilfe wird sehr geschätzt!

+0

Danke TLM für Ihre Hilfe. – ellimist

Antwort

0

Das ist nicht besonders elegant, aber das macht den Job:

format_rle <- function(rle, rn){ 
    l <- list(rle$lengths, 
    names(rle$lengths), 
    rle$values, 
    names(rle$values)) 
    m <- as.matrix(do.call(rbind, l)) 
    colnames(m) <- NULL 
    rownames(m) <- rep(rn, nrow(m)) 
    m 
} 

format_rle(progression[[1]], "foo") Versuchen Sie, die Idee zu bekommen:

[,1] [,2] [,3] 
foo "1" "3" "1" 
foo "Feb" "May" "" 
foo "1" "0" "10" 
foo "Jan" "Apr" "May" 

Dann wenden wir diese Funktion auf alle Elemente in der Progression und das Ergebnis speichern zu einzelnen CSV-Dateien, die nach den Namen in Progression benannt sind. Sie sollten a bunch of .csv Dateien in Ihrem Arbeitsverzeichnis haben (getwd(), um es zu drucken).

for (i in seq_along(progression)) 
    write.csv(format_rle(progression[[i]], names(progression)[i]), 
      file=paste0(names(progression[i]), ".csv")) 

Ist das was du willst?

+0

Vincent, ich sollte dich Mon-Homme anstelle von Bonhomme nennen. Ausgezeichnete Antwort. Ich hätte eigentlich genauer auf meine Frage eingehen sollen, da ich auch eine vollständige Excel-Ausgabe von all dem haben wollte (ich habe 2000+ Firmen), also ist das Erstellen von 2000 CSV-Dateien nicht praktisch. Also hier ist meine angepasste Code für alles in 1 Datei: 'für (i in seq_along (Progression)) write.table (format_rle (Progression [[i]], Namen (Progression) [i]), file =" append .csv ", append = T, sep =", ", Spaltenname = F)'. Das ist für alle anderen; Ich bin sicher, wenn ich es richtig ausgedrückt hätte, hättest du es auch gegeben. Danke nochmal – ellimist

+0

du bist willkommen ;-) –

Verwandte Themen