替换相同长度值的序列> 2

时间:2017-06-15 18:17:39

标签: r diff run-length-encoding

我有一个测量变量的传感器,当没有连接时,它总是返回最后看到的值,而不是NA。因此,在我的向量中,我想用一个输入的值替换这些相同的值(例如用na.approx)。

set.seed(3)
vec <- round(runif(20)*10)
####  [1] 2 8 4 3 6 6 1 3 6 6 5 5 5 6 9 8 1 7 9 3

但我只想要大于2的序列(3个或更多相同的数字),因为2个相同的数字可以自然出现。 (在前面的示例中,标记的序列为5 5 5

我尝试使用diff来标记我的相同点(c(0, diff(vec) == 0)),但我不知道如何处理length == 2条件...

修改 我的预期输出可能是这样的:

####  [1] 2 8 4 3 6 6 1 3 6 6 5 NA NA 6 9 8 1 7 9 3

(3个或更多序列的第二个相同值也很可能是错误的值)

由于

2 个答案:

答案 0 :(得分:4)

您可以使用lag功能

set.seed(3)
> vec <- round(runif(20)*10)
> 
> vec
 [1] 2 8 4 3 6 6 1 3 6 6 5 5 5 6 9 8 1 7 9 3
> 
> vec[vec == lag(vec) & vec == lag(vec,2)] <- NA
> 
> vec
 [1]  2  8  4  3  6  6  1  3  6  6  5  5 NA  6  9  8  1  7  9  3
> 

答案 1 :(得分:1)

您可以使用rle获取应分配NA的位置的索引。

vec[with(data = rle(vec),
     expr = unlist(sapply(which(lengths > 2), function(i)
         (sum(lengths[1:i]) - (lengths[i] - 2)):sum(lengths[1:i]))))] = NA
vec
#[1]  2  8  4  3  6  6  1  3  6  6  5 NA NA  6  9  8  1  7  9  3

在功能中

foo = function(X, length){
   replace(x = X,
           list = with(data = rle(X),
                       expr = unlist(sapply(which(lengths > length), function(i)
                           (sum(lengths[1:i]) - (lengths[i] - length)):sum(lengths[1:i])))),
           values = NA)
}
foo(X = vec, length = 2)
#[1]  2  8  4  3  6  6  1  3  6  6  5 NA NA  6  9  8  1  7  9  3