繁体   English   中英

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

[英]Data extraction/reshape from a data frame in R

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

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,依此类推)。 我的实际数据有很多Ids和Days以及48个Half_hrs(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小时数据)。

我们可以使用data.table 将'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

这是使用transform()aggregate()reshape()基本R的解决方案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM