Ganti urutan nilai panjang yang identik › 2

Saya memiliki sensor yang mengukur variabel dan ketika tidak ada koneksi, ia selalu mengembalikan nilai terakhir yang dilihat, bukan NA. Jadi di vektor saya, saya ingin mengganti nilai identik ini dengan nilai yang dimasukkan (misalnya dengan 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

Tapi saya hanya ingin barisan yang lebih besar dari 2 (3 atau lebih angka identik) karena 2 angka identik bisa muncul secara alami. (dalam contoh sebelumnya, urutan yang diberi tag adalah 5 5 5)

Saya mencoba melakukannya dengan diff untuk menandai titik identik saya (c(0, diff(vec) == 0)) tetapi saya tidak tahu bagaimana menangani kondisi length == 2...

EDIT hasil yang saya harapkan akan seperti ini:

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

(Nilai identik kedua dari barisan 3 atau lebih kemungkinan besar juga merupakan nilai yang salah)

Terima kasih


person agenis    schedule 15.06.2017    source sumber


Jawaban (2)


Anda dapat menggunakan rle untuk mendapatkan indeks posisi di mana NA harus ditetapkan.

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

Dalam fungsi

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
person d.b    schedule 15.06.2017

Anda dapat menggunakan fungsi 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
> 
person Mouad_Seridi    schedule 15.06.2017
comment
Dingin. Bisakah NA juga diganti mulai dari 5 yang kedua bukan yang ketiga? (saya memperbarui hasil yang diharapkan) - person agenis; 15.06.2017
comment
ya itu akan menjadi langkah ekstra vec[which(is.na(vec)) - 1] <- NA - person Mouad_Seridi; 15.06.2017
comment
oke, saya bisa melakukannya, meskipun itu akan mengacaukan NA alami... yang awalnya ada di vektor (itu bisa terjadi). Saya harus menyalahkan mereka terlebih dahulu. - person agenis; 15.06.2017
comment
Anda dapat menyiasatinya dengan menetapkan nilai tertentu pada yang ke-3 seperti -999 misalnya, lalu melakukan hal yang sama pada musuh ke-2, dan setelah Anda selesai menetapkan semuanya NA, beri tahu saya jika Anda memerlukan bantuan untuk itu. - person Mouad_Seridi; 15.06.2017