我正在使用加速度计数据(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
答案 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)
我找到了使用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
。