我有一个大型数据框,显示试验中个人在给定活动中花费的时间,试验重复了几天。以下是数据框的一部分:
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
答案 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))]
然后运行上面的解决方案