计算大型个体的频率和比率 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))]
然后运行上面的解决方案
我有一个大型数据框,显示试验中个人在给定 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))]
然后运行上面的解决方案