连续计数相同种类的值并省略中断

时间:2019-03-14 12:38:55

标签: r

我的实际问题是,我想计算向量中相似值的长度,例如:

v <- c(1,1,1,1,2,1,1,3,3,3,1,1,2,2,2)

但是我想省略所有长度为1的中断。 我如何才能达到这里的结果:

1,1,1,1,1,1,1,3,3,3,1,1,2,2,2

请注意,单身的“两个”现在应该变成一个“一”并带有

v_new <- c(1,1,1,1,1,1,1,3,3,3,1,1,2,2,2)

rle(v_new)
lengths: int [1:4] 7 3 2 3 
values : num [1:4] 1 3 1 2

谢谢, 迈克

2 个答案:

答案 0 :(得分:1)

> v <- c(1,1,1,1,2,1,1,3,3,3,1,1,2,2,2)
> 
> local.peak <- which(diff(sign(diff(v)))==-2) + 1
> 
> v[which(diff(sign(diff(v)))==-2) + 1] <- v[local.peak - 1]
> v
 [1] 1 1 1 1 1 1 1 3 3 3 1 1 2 2 2

本地峰值函数取自Finding local maxima and minima

答案 1 :(得分:1)

以下是一个小功能,它用其左侧或右侧的值替换连续出现不超过一次的值。

您的输入

v <- c(1,1,1,1,2,1,1,3,3,3,1,1,2,2,2)
fun(v)
# [1] 1 1 1 1 1 1 1 3 3 3 1 1 2 2 2

修改后的输入

v <- c(1,1,1,1,2,4,4,3,3,3,1,1,2,2,2)
#                ^ ^

用法

fun(v, align = "right")
# [1] 1 1 1 1 4 4 4 3 3 3 1 1 2 2 2

默认为左对齐

fun(v)
# [1] 1 1 1 1 1 4 4 3 3 3 1 1 2 2 2

功能

fun <- function(x, align = c("left", "right")) {
      align <- match.arg(align)
      rle_x <- rle(x)
      rle_x$values <- with(rle_x, replace(values, lengths == 1, NA))
      switch(align,
             left = approx(inverse.rle(rle_x), xout = seq_along(x), method = "constant", f = 0)$y,
             right = approx(inverse.rle(rle_x), xout = seq_along(x), method = "constant", f = 1)$y)
    }