2016-03-29 15 views
3

におけるデータフレームから再構築 - あなたは以下のコードでそれのサンプルを再作成することができますデータ抽出/ Iは、データフレームを持つ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はそのHalf_hrでその日のそのM_idのValueを表します(Half_hr:1,2は時間1、3,4は時間2など)。私の実際のデータは非常に多くのIDとDayとValを持ち、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 

例= 1000 M_ID、日= 1、Hour_1 =ヴァル(Half_hr-1 + Half_hr-2)= 0.25 + 0.1 = 0.35です。同様に、私はこれをforループとsqldfを使って行っていますが、多くの時間がかかっていました。

私は、処理しなければならないデータとして、それぞれ535日間のM_idsと毎日の48時間のHalf_hrs(24時間データ)のM_idsを持っています。

答えて

3

data.tableを使用できます。 "data.frame"を 'data.table'に変換する(setDT(df)。 "M_id"、 "Day"でグループ化した後、glを使用してグループ化変数を作成してからを使用して '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 
+0

これはHalf_hr'が注文された '前提としていRomanLuš[email protected] –

+0

を私は、以前のことを想定しますが、あなたのコメントの後に' order'ed?データ。 – akrun

3

ここ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 
+0

その作業も素晴らしいですが、比較的data.tableを持つソリューションは私のデータにとって高速です。どうもありがとうございます。 –

関連する問題