如何计算剧集的长度及其在 R 中的序号

How do I calculate the length of an episode and it's sequential number in R

我正在使用一个数据框,其中我有动物在房间里四处走动的顺序时间数据。我有一个列表示动物何时不动(isImmobile = TRUE 或 FALSE),我想创建一个新列来显示不动情节的持续时间 - 在下面的示例中它将是 3 帧 - 所以我可以排除那些太短了。

我还想包括一个列,它可以告诉我固定剧集的数量。

这是一些示例数据:

   time  speed  zone     animal   group  week  distance period isImmobile
     
1  5.26  73.8 interzone  ctrl5    ctrl    0      50.3   p1     FALSE     
2  5.29  70.8 interzone  ctrl5    ctrl    0      1.30   p1     FALSE     
3  5.33  70   interzone  ctrl5    ctrl    0      1.40   p1     TRUE
4  5.36  56.3 interzone  ctrl5    ctrl    0      1.98   p1     TRUE     
5  5.39  51.7 interzone  ctrl5    ctrl    0      2.70   p1     TRUE     
6  5.43  47   interzone  ctrl5    ctrl    0      1.84   p1     FALSE

我要找的是这样的:

   time  speed  zone     animal   group  week  distance period isImmobile  Ep_number Ep _Duration
     
1  5.26  73.8 interzone  ctrl5    ctrl    0      50.3   p1     FALSE       NA        NA      
2  5.29  70.8 interzone  ctrl5    ctrl    0      1.30   p1     FALSE       NA        NA
3  5.33  70   interzone  ctrl5    ctrl    0      1.40   p1     TRUE        1         3
4  5.36  56.3 interzone  ctrl5    ctrl    0      1.98   p1     TRUE        1         3
5  5.39  51.7 interzone  ctrl5    ctrl    0      2.70   p1     TRUE        1         3
6  5.43  47   interzone  ctrl5    ctrl    0      1.84   p1     FALSE       NA        NA

框架也可以完全省略 isImmobile = FALSE 而不是 NA 时的剧集。

最好是dplyr,其他的也不错:)

在此先感谢您。我也希望类似的问题还没有被问到 - 我找不到任何东西。

这是 data.table 的一种方法 - 在 'isImmobile' 列上使用 rleid 创建一个 run-length-encoding 列,然后使用 'grp' 作为分组列,并指定 i 中的逻辑列,我们分配两个具有组索引 (.GRP) 和行数 (.N)

的新列
library(data.table)
setDT(df1)[, grp := rleid(isImmobile)]
df1[as.logical(isImmobile), c("Ep_number", "Ep_duration") := 
   .(.GRP, .N), grp][, grp := NULL][]

-输出

> time speed      zone animal  group  week distance period isImmobile Ep_number Ep_duration
   <num> <num>    <char> <char> <char> <int>    <num> <char>     <lgcl>     <int>       <int>
1:  5.26  73.8 interzone  ctrl5   ctrl     0    50.30     p1      FALSE        NA          NA
2:  5.29  70.8 interzone  ctrl5   ctrl     0     1.30     p1      FALSE        NA          NA
3:  5.33  70.0 interzone  ctrl5   ctrl     0     1.40     p1       TRUE         1           3
4:  5.36  56.3 interzone  ctrl5   ctrl     0     1.98     p1       TRUE         1           3
5:  5.39  51.7 interzone  ctrl5   ctrl     0     2.70     p1       TRUE         1           3
6:  5.43  47.0 interzone  ctrl5   ctrl     0     1.84     p1      FALSE        NA          NA

或使用 base Rrle

cbind(df1, with(rle(df1$isImmobile), 
   data.frame(Ep_number = rep((NA^!values) * seq_len(values[values]), lengths),
    Ep_duration = rep((NA^!values) * lengths, lengths))))

数据

df1 <- structure(list(time = c(5.26, 5.29, 5.33, 5.36, 5.39, 5.43), 
    speed = c(73.8, 70.8, 70, 56.3, 51.7, 47), zone = c("interzone", 
    "interzone", "interzone", "interzone", "interzone", "interzone"
    ), animal = c("ctrl5", "ctrl5", "ctrl5", "ctrl5", "ctrl5", 
    "ctrl5"), group = c("ctrl", "ctrl", "ctrl", "ctrl", "ctrl", 
    "ctrl"), week = c(0L, 0L, 0L, 0L, 0L, 0L), distance = c(50.3, 
    1.3, 1.4, 1.98, 2.7, 1.84), period = c("p1", "p1", "p1", 
    "p1", "p1", "p1"), isImmobile = c(FALSE, FALSE, TRUE, TRUE, 
    TRUE, FALSE)), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6"))