【问题标题】:Time intervals between resightings of several individuals几个人重新观察之间的时间间隔
【发布时间】:2017-07-29 10:40:45
【问题描述】:

在 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 中启动该过程。

【问题讨论】:

    标签: r dataframe tapply


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2021-08-21
      相关资源
      最近更新 更多