2017-12-30 28 views
-2

So sah ich mich um zu vorherigen Fragen, aber ich konnte nicht finden, was ich suchte/konnte keine der bisherigen Lösungen an die Arbeit ...Recasting/einen Datenrahmen in R Neuformatierung

Ich werde die dput, so dass Sie mein Beispiel wiedergeben können, aber hier ist das, was mit ich arbeite:

price date   name 
1 2300 2017-09-27 Fabinho 
2 2200 2017-09-28 Fabinho 
3 21625 2017-09-29 Fabinho 
4 24750 2017-09-30 Fabino 

oder

structure(list(price = c(23000, 22000, 21625, 24750), date = structure(c(17436, 
    17437, 17438, 17439), class = "Date"), name = c("Fabinho", "Fabinho", 
    "Fabinho", "Fabinho")), .Names = c("price", "date", "name"), row.names = 
    c(NA, 4L), class = "data.frame") 

Im Grunde, was ich suche ist ein Datenrahmen mit einer Reihe - wo der Zeilenwert das p ist Layername - mit jedem Datum als Spaltennamen und dem Preis als Einzelzellenwert. Bisher ist die nächste, die ich bekommen habe, ist die „reshape2“ Bibliothek wie:

tempDF <- acast(melt(as.matrix(player_DF)), Var1~Var2, value.var = 'value', fill=0) 

ich versucht habe Herumspielen mit dem Wert, Var1 und Var2 ohne Erfolg sind. Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

Antwort

0

Mit tidyverse Ansatz:

library(tidyverse) 
mydf %>% 
    spread(key=date,value=price,fill=0) 

Sie die folgende Ausgabe erhalten:

 name 2017-09-27 2017-09-28 2017-09-29 2017-09-30 
1 Fabinho  2300  2200  21625   0 
2 Fabino   0   0   0  24750 
0

Da name die linke geht wir wollen, dass auf der linken Seite unserer Formel und da date geht ganz oben wollen wir das auf der rechten Seite der Formel. Die Werte selbst im Hauptteil der Tabelle sind durch price angegeben, also geben Sie an, dass diese Spalte die value.var ist.

library(reshape2) 

dcast(player_DF, name ~ date, value.var = "price") 
##  name 2017-09-27 2017-09-28 2017-09-29 2017-09-30 
## 1 Fabinho  23000  22000  21625  24750 

Alternativ ist hier eine Basislösung, die mit Klassenvektor c("xtabs", "table") ein Objekt gibt. Die linke Seite ist die Menge, die in den Körper des Tisches und die rechte Seite ist die zwei Dimensionen.

xtabs(price ~ name + date, player_DF) 
##   date 
## name  2017-09-27 2017-09-28 2017-09-29 2017-09-30 
## Fabinho  23000  22000  21625  24750 

Beachten Sie, dass die dput Ausgabe in der Frage ist nicht das gleiche wie die print Ausgabe von player_DF. Oben haben wir den dput Ausgang benutzt.