计算大型data.frame中个人的频率和速率

时间:2015-02-18 18:35:25

标签: r dataframe frequency rate subset

我有一个大型数据框,显示试验中个人在给定活动中花费的时间,试验重复了几天。以下是数据框的一部分:

    Individual  Time    activity    trialDuration   Julian
    OY-SG   27  pr  82  161
    CY-OG   70  al  82  161
    OY-SG   17  pr  82  161
    OY-SG   10  perch   82  161
    OY-SG   27  pr  82  161
    OY-SG   18  pr  82  161
    SG-YR   16  pr  82  161
   HS-YG    52  perch   135 162
   HS-YG    19  pr  135 162

首先,我尝试创建第二个数据帧,其频率为每个人每天的给定活动(在上例中表示为Julian)。 其次,我想计算每个人每天给定活动所花费的时间作为一个比率。我需要为每个朱利安日的每个人计算时间列,并将该总计时间除以给定朱利安日的trialDuration。 我尝试使用aggregate()来查找每个人每个活动的频率:aggregate(个人,by = list(Category = prdata $ activity),FUN = sum) 但我知道我做得不对。 我不知道最好的方式组织起来并得到这些问题,并希望得到比我更了解代码的人的建议(大多数人都是这样!) 非常感谢你。

对于第二个聚合,我试图总结在给定日期为每个人做的每个活动所花费的所有时间,然后将该总和除以当天的试验持续时间。上表中第一行的预期结果看起来像这样:

    Individual  Rate         activity       Julian
    OY-SG   (27+17+27+18)/82    pr            161

1 个答案:

答案 0 :(得分:0)

这是一个快速的data.table解决方案

library(data.table)
setDT(df)[, .(
              ActFreq = .N,
              TimeRate = sum(Time)/trialDuration[1L]
             ),
          by = .(Individual, Julian, activity)]

#    Individual Julian activity ActFreq  TimeRate
# 1:      OY-SG    161       pr       4 1.0853659
# 2:      CY-OG    161       al       1 0.8536585
# 3:      OY-SG    161    perch       1 0.1219512
# 4:      SG-YR    161       pr       1 0.1951220
# 5:      HS-YG    162    perch       1 0.3851852
# 6:      HS-YG    162       pr       1 0.1407407

根据您的评论进行修改,如果Time是一个因素,您可能希望首先将其转换为数字类(而不是在每次迭代中执行此操作),只需执行

setDT(df)[, Time := as.numeric(as.character(Time))]

然后运行上面的解决方案

相关问题