从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解决我的数据很快。非常感谢。