【问题标题】:How to create a duration vector from a dataframe?如何从数据帧创建持续时间向量?
【发布时间】:2019-06-17 12:41:08
【问题描述】:

我想从数据框创建一个持续时间向量。 fata 框架包括几种行为以及这些行为的开始和结束时间。这个想法是用每个行为的持续时间填充向量,而不考虑行为的类型。

例如:原始数据帧

Time    Subject  Behavior  Status
11.901  M        FOR       START
20.896  M        FOR       STOP
20.897  M        NI        START
22.646  M        NI        STOP
22.647  M        FOR       START
26.898  M        TSp       POINT
29.146  M        FOR       STOP
29.147  M        NI        START
30.646  M        NI        STOP
30.647  M        FOR       START
32.148  M        TSp       POINT
39.397  M        FOR       STOP
39.398  M        NI        START
43.647  M        NI        STOP
43.648  M        FOR       START
48.647  M        FOR       STOP
48.648  M        NI        START
51.147  M        NI        STOP
51.148  M        FOR       START
52.088  M        TSp       POINT
54.585  M        FOR       STOP
54.586  M        NI        START
61.334  M        NI        STOP
61.335  M        FOR       START
65.084  M        FOR       STOP
65.085  M        NI        START
66.878  M        NI        STOP

=> 我想要的: 持续时间:(8.995, 1.749, 4,251, 1, 1.248, ....)

我面临的问题:区分和配对代码中不同行为的开始和结束。此外,在“状态”行中具有“点”的行为很难包括在内,因为我们无法从数据帧中计算出持续时间。我想考虑为 1 秒,但这意味着:

22.647  M    FOR       START     
26.898  M    TSp       POINT  
29.146  M    FOR       STOP   

应该改成这样:

22.647  M       FOR      START
26.897  M       FOR      STOP
26.898  M       TSp      START 
27.898  M       TSp      STOP
27.899  M       FOR      START
29.146  M       FOR      STOP

这是我在示例中计算出来的。

这真的很烦人,因为我还有其他“点事件行为”,如果我们需要转换所有内容,那将是一团糟。如果我们不能很容易地添加它,我希望我们不认为是适当的持续时间,但我仍然需要它出现在持续时间向量中。

提前感谢您的帮助,我仍然不擅长与 R.. 交谈。

【问题讨论】:

  • 当有"POINT"时,为什么不计算STOP - START然后减去1秒?

标签: r


【解决方案1】:

我相信以下代码是问题所要求的。
它首先根据问题中的规则创建一个删除了Status == 'POINT' 的数据框。然后调用另一个函数来计算持续时间向量。

removePOINT <- function(DF){
  while(any(DF[['Status']] == 'POINT')){
    n <- nrow(DF)
    i <- min(which(DF[['Status']] == 'POINT'))
    Tm <- DF[i, 'Time']
    Time <- c(Tm - 0.001, Tm, Tm + 1, Tm + 1.001)
    Subject <- rep(DF[i, 'Subject'], 4)
    Behavior <- rep(DF[i, 'Behavior'], 4)
    Status <- rep(c('STOP', 'START'), 2)
    tmp <- data.frame(Time, Subject, Behavior, Status)
    DF <- rbind(DF[1:(i - 1), ], tmp, DF[(i + 1): n, ])
  }
  DF
}
computeDuration <- function(DF){
  grp <- cumsum(DF[['Status']] == "START")
  agg <- aggregate(Time ~ grp, DF, function(x) {
    duration <- x[length(x)] - x[1]
  })
  subtr <- tapply(grp, grp, function(x) if(length(x) > 2) -1 else 0)
  agg[['Time']] <- agg[['Time']] + subtr
  agg[['Time']]
}

df2 <- removePOINT(df1)
computeDuration(df2)
# [1] 8.995 1.749 4.250 1.000 1.247 1.499 1.500 1.000 6.248 4.249 4.999
#[12] 2.499 0.939 1.000 1.496 6.748 3.749 1.793

最后清理。

rm(df2)

【讨论】:

  • 效果很好!!那么现在有了这个输出,我们怎么能指出哪个持续时间是针对哪个行为的呢?在任何数据框中。因为这个想法是为 2 个人提供这个向量或表格,然后比较他们的行为。
  • @SmartFish 你想要每个Behavior 还是每个Subject 的持续时间?
  • 两者 ^^ 喜欢我们计算的每个持续时间,每个主题的行为
猜你喜欢
  • 2019-10-09
  • 2012-04-24
  • 2022-12-14
  • 1970-01-01
  • 2022-07-11
  • 2014-08-05
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多