แทนที่ลำดับของค่าความยาวที่เท่ากัน › 2

ฉันมีเซ็นเซอร์ที่ใช้วัดตัวแปร และเมื่อไม่มีการเชื่อมต่อ มันจะส่งคืนค่าสุดท้ายที่เห็นแทน 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 ขึ้นไปก็อาจเป็นค่าที่ผิดเช่นกัน)

ขอบคุณ


person agenis    schedule 15.06.2017    source แหล่งที่มา


คำตอบ (2)


คุณสามารถใช้ 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
person d.b    schedule 15.06.2017

คุณสามารถใช้ฟังก์ชัน 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
เย็น. เป็นไปได้ไหมที่จะแทนที่ NA โดยเริ่มที่ 5 ที่สอง ไม่ใช่ครั้งที่สาม (ฉันอัปเดตผลลัพธ์ที่คาดหวังไว้) - person agenis; 15.06.2017
comment
ใช่ นั่นจะเป็นขั้นตอนพิเศษ vec[which(is.na(vec)) - 1] <- NA - person Mouad_Seridi; 15.06.2017
comment
ตกลง ฉันสามารถทำอย่างนั้นได้ แม้ว่ามันจะยุ่งกับ NA ตามธรรมชาติ... เริ่มแรกอยู่ในเวกเตอร์ (มันสามารถเกิดขึ้นได้) ฉันคงต้องตำหนิพวกเขาก่อน - person agenis; 15.06.2017
comment
คุณสามารถหลีกเลี่ยงสิ่งนั้นได้โดยการกำหนดค่าเฉพาะให้กับตัวที่ 3 เช่น -999 จากนั้นทำแบบเดียวกันกับศัตรูตัวที่ 2 และเมื่อคุณมอบหมาย NA ทั้งหมดเสร็จแล้ว โปรดแจ้งให้เราทราบหากคุณต้องการความช่วยเหลือในเรื่องนี้ - person Mouad_Seridi; 15.06.2017