在R中,我需要计算标记个体的重新绑定之间的几个时间间隔变量。我有一个类似的数据集:
ID Time Day Month
a 11.15 13 6
a 12.35 13 6
a 10.02 14 6
a 19.30 15 6
a 20.46 15 6
.
.
.
b 11.12 8 7
etc
其中每个ID
表示标记为个人识别的不同动物,每行包含重新定位的日期和时间。
对于每个人,我需要计算观察每只动物的天数,每天重新安置次数的平均值和标准差,以及重新定位之间经过的天数的平均值和标准差(包括0在同一天观察之间的几天。
理想情况下,我需要获得这样的数据框:
ID N.Obs N.days mean.Obs.per.Day m.O.D.sd mean.days.elapsed mde.sd
a 27 7 4.2 1.1 1.5 0.5
b 32 5 3.4 0.4 3.2 0.7
c 17 6 4.4 0.2 4.5 1.2
d etc
我一直在使用tapply函数并将结果传输到Excel,但我确信必须有一个相对简单的代码可以帮助我点燃R中的进程。
答案 0 :(得分:0)
OP要求按ID
汇总6个统计信息。其中四个可以通过ID
分组直接汇总。两个(mean.Obs.per.Day
和m.O.D.sd
)需要按日期分组,ID
首先进行分组。
不幸的是,时间戳分为三个不同的字段,Time
,Day
和Month
,缺少年份。由于其中四个统计数据基于日期,因此我们需要构建一个Date
列,其中包含Day
,Month
和虚拟年份。
以下代码使用data.table
和lubridate
包来提高效率。
library(data.table)
# coerce to data.table and add Date column
setDT(DF)[, Date := lubridate::make_date(, Month, Day)]
# aggregate by ID,
# use temporary variable to hold the day differences between resightings
agg_per_id <- DF[, {
tmp <- as.numeric(diff(Date))
.(N.Obs = .N, N.days = uniqueN(Date),
mean.days.elapsed = mean(tmp),
mde.sd = sd(tmp))
} , by = ID]
# aggregate by Date and ID
agg_per_day_and_id <- DF[, .N, by = .(ID, Date)][
, .(mean.Obs.per.Day = mean(N), m.O.D.sd = sd(N)), by = ID]
# join partial results
result <- agg_per_day_and_id[agg_per_id, on = "ID"]
# reorder columns (for comparison with expected result)
setcolorder(result, c("ID", "N.Obs", "N.days", "mean.Obs.per.Day",
"m.O.D.sd", "mean.days.elapsed", "mde.sd"))
result
ID N.Obs N.days mean.Obs.per.Day m.O.D.sd mean.days.elapsed mde.sd 1: a 5 3 1.666667 0.5773503 0.5 0.5773503 2: b 1 1 1.000000 NA NaN NA
请注意,由于输入数据不同,这些数字与OP的预期结果不同。
据OP提供
DF <- readr::read_table(
"ID Time Day Month
a 11.15 13 6
a 12.35 13 6
a 10.02 14 6
a 19.30 15 6
a 20.46 15 6
b 11.12 8 7"
)