2012-04-12 95 views
1

我只是想知道,如果你能引導我,我怎麼能重塑基於特定標準的數據集的正確方向小時安排,例如,我有follwing例如數據集: Dataframe重塑數據集

我試圖重塑數據集是這樣的:

enter image description here

我怎麼能繼續此整形嗎?非常感謝。

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)) 

回答

5

這使用reshape2包。我確信它可以用reshape函數完成,但我不那麼容易。

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

這給

> 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 

如果你不喜歡從這些名稱,可以事後更改。

所以widedata是:

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

編輯:

> 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我還在打字。 'reshape'包和'cast'會做同樣的事情。 'cast(data,date + day〜hour,value ='Value')' – Justin 2012-04-12 19:52:11

+0

感謝Brian和Justin,這就是我想要了解如何整體重塑的原因。再次感謝,問候# – Achak 2012-04-12 19:55:49

3

這可以通過使用reshape

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

感謝斯穆爲您的答案,第一個更適合我所尋找的,但謝謝你試圖幫助我:) – Achak 2012-04-12 19:58:37

3

這是一個辦法做到這一點的基礎來解決:像Brian一樣

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

產量::如果要保留名稱使用使用

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

感謝您的回答:) – Achak 2012-04-12 19:58:53

1

使用dplyrtidyr包更新:

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

如果更改列名稱,'庫(dplyr); data%>%mutate(hour = paste0('hour',hour))%>%spread(hour,Value))'或者只是使用'spread(data,hour,Value)%>%setNames(。,c(names (。)[1:2],paste0('hour',names(。)[3:6])))' – akrun 2015-07-08 19:44:12

+1

@akrun看起來好多了。我將要通過其他例子,練習廣泛而長久的重塑。 – 2015-07-08 19:49:27