我有一个数据框 - 您可以使用以下代码重新创建它的示例:
df = data.frame(M_id = c(rep(1000,8),rep(1001,8)), Day = c(rep(1,4),rep(2,4),rep(1,4),rep(2,4)), Half_hr = rep(1:4,4) ,Val = c(0.25,0.1,0.2,0.4,0.3,0.6,0.35,0.5,0.15,0.2,0.3,0.5,0.4,0.7,0.45,0.6))
看起来像这样:
>df :
M_id Day Half_hr Val
1000 1 1 0.25
1000 1 2 0.1
1000 1 3 0.2
1000 1 4 0.4
1000 2 1 0.3
1000 2 2 0.6
1000 2 3 0.35
1000 2 4 0.5
1001 1 1 0.15
1001 1 2 0.2
1001 1 3 0.3
1001 1 4 0.5
1001 2 1 0.4
1001 2 2 0.7
1001 2 3 0.45
1001 2 4 0.6
这里,在每一行中,Val代表该日的那个M_id的值,即Half_hr(Half_hr:1,2是小时1,3,4是小时2,依此类推)。我的实际数据有很多ID和天数以及48个半小时(24小时)的价值
现在,我想将每个Half_hr的数据汇总到每个小时,每天每个M_id。
我的输出应如下所示:
>df:
M_id Day Hour_1 Hour_2
1000 1 0.35 0.6
1000 2 0.9 0.85
1001 1 0.35 0.8
1001 2 0.11 1.05
示例是M_id = 1000,Day = 1,Hour_1 = Val(Half_hr-1 + Half_hr-2)= 0.25 + 0.1 = 0.35。类似地,对于Hour_2 = val(Half_hr-3 + Half_hr-4)= 0.2 + 0.4 = 0.6
我使用for循环和sqldf完成了这项工作,但这需要花费很多时间。
我请求优化代码,因为我必须处理的数据有1000个M_ids,每个M5ids为535天,每天48个Half_hrs(24小时数据)。
答案 0 :(得分:3)
我们可以使用data.table
。转换' data.frame'到' data.table' (setDT(df)
。在按" M_id"," Day"分组后,使用gl
创建分组变量,然后使用dcast
转换为&# 39;长期'广泛格式
library(data.table)
df1 <- setDT(df)[order(M_id,Day, Half_hr)][,
gr:=gl(.N, 2, .N) , .(M_id ,Day)][]
dcast(df1, M_id+Day~paste0("Hour_", gr), value.var="Val", sum)
# M_id Day Hour1 Hour2
#1: 1000 1 0.35 0.60
#2: 1000 2 0.90 0.85
#3: 1001 1 0.35 0.80
#4: 1001 2 1.10 1.05
答案 1 :(得分:3)
以下是基础R中使用transform()
,aggregate()
和reshape()
的解决方案:
reshape(aggregate(Val~.,transform(df,Hour=(Half_hr-1L)%/%2L+1L,Half_hr=NULL),sum),dir='w',idvar=c('M_id','Day'),timevar='Hour');
## M_id Day Val.1 Val.2
## 1 1000 1 0.35 0.60
## 2 1001 1 0.35 0.80
## 3 1000 2 0.90 0.85
## 4 1001 2 1.10 1.05