2012-04-12 11 views
1

Ich frage mich, wenn Sie mich in die richtige Richtung lenken konnte, wie kann ich einen Datensatz basierend auf bestimmten Kriterien neu zu gestalten, indem Stunden, zum Beispiel zu arrangieren, ich habe das follwing Beispiel-Datensatz: Dataframeumformen Dataset

ich versuche, den Datensatz neu zu gestalten wie folgt aussehen:

enter image description here

wie kann ich mit dieser Umformung gehen Sie? Danke vielmals.

My sample data: 

data = structure(list(date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = "Jan-97", class = "factor"), day = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), hour = c(1L, 2L, 
3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), Value = c(65L, 29L, 
31L, 42L, 42L, 52L, 61L, 57L, 55L, 52L, 57L, 46L)), .Names = c("date", 
"day", "hour", "Value"), class = "data.frame", row.names = c(NA, 
-12L)) 

Antwort

5

Dies verwendet das reshape2 Paket. Ich bin sicher, dass es mit der reshape Funktion getan werden kann, aber ich bin nicht so leicht damit.

library("reshape2") 
dcast(data, date+day~hour, value.var="Value") 

die

> dcast(data, date+day~hour, value.var="Value") 
    date day 1 2 3 4 
1 Jan-97 1 65 29 31 42 
2 Jan-97 2 42 52 61 57 
3 Jan-97 3 55 52 57 46 

Wenn Sie aus, dass die Namen nicht mögen gibt, können Sie sie später ändern.

so widedata ist:

> widedata 
    date day hour1 hour2 hour3 hour4 
1 Jan-97 1 65 29 31 42 
2 Jan-97 2 42 52 61 57 
3 Jan-97 3 55 52 57 46 
+1

+1 ich noch schreiben. das 'reshape' Paket und' cast' machen dasselbe. 'cast (Daten, Datum + Tag ~ Stunde, Wert = 'Wert')' – Justin

+0

Danke Brian und Justin, das ist genau das, was ich gesucht habe, um zu verstehen, wie man generell umformt. Nochmals vielen Dank, Grüße, # – Achak

3

Diese reshape

reshape(data, idvar=c('date','day'), direction='wide', timevar='hour') 
+0

danke Smu für Ihre Antwort, die erste ist besser geeignet für das, was ich suche, aber danke für den Versuch, mir zu helfen :) – Achak

3

gelöst werden kann unter Verwendung Dies ist eine Möglichkeit, es in der Basis zu tun:

reshape(data, timevar = c("hour"), v.names = c("Value"), 
    idvar = c("date", "day"), direction = "wide") 

EDIT: Wie Brian verwendet, wenn die Namen verwenden, beibehalten möchten:

names(DF)[-c(1:2)] <- paste0("hour", 1:4) 
rownames(DF)<- 1:nrow(DF) 
DF 

Nachgeben:

date day hour1 hour2 hour3 hour4 
1 Jan-97 1 65 29 31 42 
2 Jan-97 2 42 52 61 57 
3 Jan-97 3 55 52 57 46 
+0

Danke für Ihre Antwort :) – Achak

1

Ein Update mit dplyr und tidyr Pakete:

library(tidyr) 
library(dplyr) 
data %>% mutate(hour=paste0('hour', hour)) %>% spread(hour, Value) 
# date day hour1 hour2 hour3 hour4 
#1 Jan-97 1 65 29 31 42 
#2 Jan-97 2 42 52 61 57 
#3 Jan-97 3 55 52 57 46 
+0

Im Fall, um die Spalte zu ändern Namen, 'Bibliothek (dplyr); Daten%>% muate (Stunde = Paste0 ('Stunde', Stunde))%>% Spread (Stunde, Wert)) 'oder einfach' Spread (Daten, Stunde, Wert)%>% setNames (., c (Namen (.) [1: 2], paste0 ('Stunde', Namen (.) [3: 6]))) ' – akrun

+1

@akrun Sieht viel besser aus. Ich werde andere Beispiele durchgehen und weite und lange Umformungen üben. –