2017-06-15 50 views
3

我有其測量變量,並且當沒有連接它總是返回看出代替NA的最後一個值的傳感器。所以在我的向量中,我想用一個空白值替換這些相同的值(例如na.approx)。替換長度的相同值的序列> 2

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個或更多序列的第二個相同的價值是非常可能是一個錯誤值太)

感謝

回答

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 
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 
> 
+0

涼爽。是否有可能從第二個5開始而不是第三個開始取代NA? (我更新了我的預期輸出) – agenis

+2

是,這將是一個額外的步驟'VEC [其中(is.na(VEC)) - 1] < - NA' –

+0

好吧,我可以與去,雖然它會亂用「天然的「NA ......最初出現在矢量中(可能發生)。我必須首先對他們進行評估。 – agenis

相關問題