替换长度 > 2 的相同值序列
Replace sequence of identical values of length > 2
我有一个测量变量的传感器,当没有连接时,它 returns 总是最后看到的值而不是 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个或更多的序列的第二个相同值也很可能是错误值)
谢谢
你可以使用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
>
您可以使用 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
我有一个测量变量的传感器,当没有连接时,它 returns 总是最后看到的值而不是 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个或更多的序列的第二个相同值也很可能是错误值)
谢谢
你可以使用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
>
您可以使用 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