从R中的数据帧进行数据提取/重塑

从R中的数据帧进行数据提取/重塑,r,dataframe,R,Dataframe,我有一个数据帧-您可以使用以下代码重新创建它的示例: 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

我有一个数据帧-您可以使用以下代码重新创建它的示例:

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
>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
在这里,在每一行中,Val表示当天该M_id在该半小时内的值(半小时:1,2是小时1,3,4是小时2,依此类推)。我的实际数据有48个半小时(24小时)的ID、天数和Val

现在,我想将每半小时的数据汇总到每天每个M_id的每小时中

我的输出应该如下所示:

>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
>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。同样,对于小时2=val(半小时3+半小时4)=0.2+0.4=0.6

我已经使用for循环和sqldf完成了这项工作,但是它花费了很多时间


我请求优化代码,因为我必须处理的数据有1000个M_ID,每个ID持续535天,每天48个半小时(24小时数据)。

我们可以使用
数据。表
。将“data.frame”转换为“data.table”(
setDT(df)
。在按“M_id”、“Day”进行分组后,使用
gl
创建一个分组变量,然后使用
dcast
将“long”格式转换为“wide”格式

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
库(data.table)

df1这是一个在base R中使用和的解决方案:


这是否假设
Half_hr
已订购?@RomanLuštrik我之前假设过,但在您的评论之后,
order
删除了数据。它也很有效。但相对而言,使用data.table解决我的数据很快。非常感谢。