r: новая переменная продолжительность боя - PullRequest
1 голос
/ 07 июня 2019

Я работаю с данными акселерометра (столбец SB) и хотел бы добавить переменную, которая подсчитывает продолжительность тренировки, например, сидя (SB), и возобновляет счет после того, как человек встал ("SB_count").На втором шаге я хотел бы создать 2-ю переменную («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 голосов
/ 07 июня 2019

Я нашел решение, используя rle, fill и mutate. Сначала создали вашу отправную точку:

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.

0 голосов
/ 07 июня 2019

Думаю, я взломал его, используя ваш игрушечный пример.Для SB_bout я использовал @ функцию Томми для нахождения локальных пиков в векторе.Я думаю, что это должно сработать для других данных, которые вы можете иметь в этом формате, но вы все же должны взглянуть на специфику функции.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...