几个人的尊重之间的时间间隔

时间:2017-07-29 10:40:46

标签: r dataframe tapply

在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中的进程。

1 个答案:

答案 0 :(得分:0)

OP要求按ID汇总6个统计信息。其中四个可以通过ID分组直接汇总。两个(mean.Obs.per.Daym.O.D.sd)需要按日期分组,ID首先进行分组。

不幸的是,时间戳分为三个不同的字段,TimeDayMonth,缺少年份。由于其中四个统计数据基于日期,因此我们需要构建一个Date列,其中包含DayMonth和虚拟年份。

以下代码使用data.tablelubridate包来提高效率。

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"
)