2016-07-06 53 views
0
>head(df) 
     person week target actual drop_out organization agency 
1:  QJ1 1  30  19 TRUE  BB   LLC 
2:  GJ2 1  30  18 FALSE  BB   LLC 
3:  LJ3 1  30  22 TRUE  CC   BBR 
4:  MJ4 1  30  24 FALSE  CC   BBR 
5:  PJ5 1  35  55 FALSE  AA   FUN 
6:  EJ6 1  35  50 FALSE  AA   FUN 

數據集中存在大約30周的每週重複Person ID。R:根據四行組創建平均值列

我想看看每個人的價值觀每週四個星期(如1-4周,5-9,10-13等)。對於這些塊中的每一個,我想將所有「實際」列加起來,並將其除以「目標」列的總和。然後我們可以把這個價值放在一個名爲「每月百分比」的列中。

按形狀的建議,我已經創建了一個一個月柱像這樣

fullReshapedDT$month <- with(fullReshapedDT, ceiling(week/4)) 

試圖找出如何遍歷月份列,現在計算平均值。嘗試這樣的事情,但它顯然不工作:

fullReshapedDT[,.(monthly_attendance = actual/target,by=.(person_id, month)] 
+0

你究竟在哪裏陷入困境?如果你提供了一個[可重現的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)(可能用假數據),這將有助於更好地說明問題。爲樣本輸入提供所需的輸出,以便測試可能的解決方案。如果您已經嘗試自行完成此操作,請包含您的代碼並描述您所處的位置。 – MrFlick

+2

使用'ceiling(week/4)* 4'上的一些東西創建一個新列,然後將其組合在一起 – Shape

+0

感謝您的想法Shape。現在就試試吧 – Parseltongue

回答

1

您是否嘗試過創建組變量?它可以讓你按照四周的時間分組操作:

setDT(df1)[,grps:=ceiling(week/4)  #Create 4-week groups 
      ][,sum(actual)/sum(target), .(person, grps) #grouped operations 
      ][,grps:=NULL][]  #Remove unnecessary columns 
#  person  V1 
# 1:  QJ1 1.1076923 
# 2:  GJ2 1.1128205 
# 3:  LJ3 0.9948718 
# 4:  MJ4 0.6333333 
# 5:  PJ5 1.2410256 
# 6:  EJ6 1.0263158 
# 7:  QJ1 1.2108108 
# 8:  GJ2 0.6378378 
# 9:  LJ3 0.9891892 
# 10: MJ4 0.8564103 
# 11: PJ5 1.1729730 
# 12: EJ6 0.8666667 
+0

哇。這難以置信。我不熟悉這種語法或分組操作。你知道有什麼好的資源可以學習嗎? – Parseltongue

+1

這裏有一些小插曲https://github.com/Rdatatable/data.table/wiki/Getting-started –

+0

謝謝,皮埃爾。它看起來像你連續操作data.table使用[] ...這是如何工作的? – Parseltongue