计算大型个体的频率和比率 data.frame

Calculate frequency and rate by for individuals in large data.frame

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

    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

首先,我尝试创建第二个数据框,其频率为每个人每天给定 activity(在上例中表示为 Julian)。 其次,我想计算每个人每天花在给定 activity 上的时间作为比率。我需要计算每个儒略日每个人的时间列,并将这个总和时间除以给定儒略日的 trialDuration。 我尝试使用 aggregate() 来查找每个人每个 activity 的频率:aggregate(Individual, by=list(Category=prdata$activity), FUN=sum) 但我知道我做得不太对。 我不知道组织和解决这些问题的最佳方法,并且希望得到比我更了解代码的人(你们中的大多数人!)的建议 非常感谢。

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

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

这是一个快速 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 是一个因素,您可能希望首先将其转换为数字 class(而不是在每次迭代中都这样做),只需执行

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

然后运行上面的解决方案