r:新的回合持续时间

时间:2019-06-07 10:03:43

标签: r

我正在使用加速度计数据(SB列),并且想添加一个变量来计算活动周期的长度,例如坐下(SB),并在该人起床后重新开始计数(“ SB_count”)。 在第二步中,我想创建第二个变量(“ SB_bout”,该变量仅保留最终的回合长度值。

我坚持了一段时间,可能是因为我使用了错误的搜索词,所以如果有人可以向我指出正确的方向,我将非常感谢。

它应该是这样的:

      SB      SB_count  SB_bout
1     1       1         0
2     1       2         0
3     1       3         3
4     0       0         0
5     1       1         0
6     1       2         2

2 个答案:

答案 0 :(得分:0)

想想我用你的玩具例子破解了它。对于SB_bout,我使用@Tommy's function在向量中查找局部峰。 我认为它应该可以解决这种格式的其他数据的问题,但是您仍然应该了解该函数的细节。

Data <- data.frame(SB = c(1,1,1,0,1,1))

Data$SB_count <- ave(Data$SB, cumsum(Data$SB==0), FUN=cumsum)

# Find peaks function
localMaxima <- function(x) {
  # Use -Inf instead if x is numeric (non-integer)
  y <- diff(c(-.Machine$integer.max, x)) > 0L
  rle(y)$lengths
  y <- cumsum(rle(y)$lengths)
  y <- y[seq.int(1L, length(y), 2L)]
  if (x[[1]] == x[[2]]) {
    y <- y[-1]
  }
  y
}

Data$SB_bout <- Data$SB_count
Data$SB_bout[-localMaxima(Data$SB_count)] <- 0

Data

  SB SB_count SB_bout
1  1        1       0
2  1        2       0
3  1        3       3
4  0        0       0
5  1        1       0
6  1        2       2

答案 1 :(得分:0)

我找到了使用rlefillmutate的解决方案。 首先创建您的起点:

library(tidyr)
library(dplyr)

SB <- c(1,1,1,0,1,1)
df <- data.frame(SB)

然后使用SB_count添加了rle。我还需要一个run号以便随后分组:

df$SB_count <- sequence(rle(df$SB)$lengths)
df$SB_count[df$SB == 0] <- 0
nstarts <- length(df$SB_count[df$SB_count == 1])
df$run[df$SB_count == 1] <- 1:nstarts
df <- fill(df, run)
df <- df[,c(3,1:2)]

最后按run分组并添加max值:

df <- df %>% group_by(run) %>%
  mutate(SB_bout = max(SB_count))

df$run[df$SB == 0] <- 0
df$SB_bout[df$SB == 0] <- 0

这将提供以下输出:

    run    SB SB_count SB_bout
  <dbl> <dbl>    <dbl>   <dbl>
1     1     1        1       3
2     1     1        2       3
3     1     1        3       3
4     0     0        0       0
5     2     1        1       2
6     2     1        2       2

与您的唯一区别在于,我在该SB_bout的每一行中都显示了最大的run