2016-07-06 55 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