我的实际问题是,我想计算向量中相似值的长度,例如:
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
谢谢, 迈克
答案 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)
}