【问题标题】:Calculate frequency and rate by for individuals in large data.frame计算大型data.frame中个人的频率和速率
【发布时间】:2015-02-18 18:35:25
【问题描述】:

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

    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(Individual, by=list(Category=prdata$activity), FUN=sum) 但我知道我做得不太对。 我不知道组织和解决这些问题的最佳方法,并且希望得到比我更了解代码的人的建议(你们中的大多数人!) 非常感谢你。

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

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

【问题讨论】:

  • table 计算频率
  • 您想要的结果会是什么样子?第一个聚合很简单,而第二个不太清楚。
  • 对于第二次聚合,我试图将每个人花费在每个活动上的所有时间相加。上表第一行的预期结果看起来像这样:个人利率活动 Julian OY-SG (27+17+27+18)/82 pr 161
  • @DavidArenburg 您建议如何执行第一次聚合?
  • 在下面查看我的答案。你现在如何安装包?

标签: r dataframe frequency rate subset


【解决方案1】:

这是一个快速的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))]

然后运行上面的解决方案

【讨论】:

  • 您的解决方案看起来很棒!不幸的是,当我用我的整个数据框尝试这个时,即使在使用命令 as.numeric(Time) 之后,我也会收到以下错误消息: Summary.factor 中的错误(c(215L,126L,215L,138L,383L,310L), na.rm = FALSE) : 'sum' 对因子没有意义。
  • 尝试用sum(as.numeric(as.character(Time)))替换sum(Time)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
相关资源
最近更新 更多