我只是想知道您是否可以指导我如何根据特定标准重新整形数据集以按小时排列,例如,我有以下示例数据集:
我正在尝试将数据集重塑为如下所示:
请问如何重新进行此重塑?非常感谢。
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))
答案 0 :(得分: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 <- dcast(data, date+day~hour, value.var="Value")
names(widedata)[-(1:2)] <- paste0("hour",names(widedata[-(1:2)]))
所以widedata
是:
> 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 :(得分:3)
这可以使用reshape
reshape(data, idvar=c('date','day'), direction='wide', timevar='hour')
答案 2 :(得分:3)
这是在基地进行的一种方式:
reshape(data, timevar = c("hour"), v.names = c("Value"),
idvar = c("date", "day"), direction = "wide")
编辑:像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
答案 3 :(得分:1)
使用dplyr
和tidyr
软件包进行更新:
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