2017-01-24 10 views
2

ich einen Datenrahmen haben wie folgt aus:R: insert NAs in einer Spalte, wenn Variablennamen in einer anderen Spalte ändert

library(data.table) 
set.seed(1234) 
DT<-data.table(x=c("a","a","a","b","b","c","c","c","d","d","d","d"),v=sample(1:4,12,replace = T)) 

    x v 
    a 1 
    a 3 
    a 3 
    b 3 
    b 4 
    c 3 
    c 1 
    c 1 
    d 3 
    d 3 
    d 3 
    d 3 

Was ich tun muss, ist, den Wert „v“ bedingt jedes Mal zu ersetzen, die Variable „x“ ändert, etwa so:

 x v 
     a 1 
     a 3 
     a 3 
     b NA 
     b 4 
     c NA 
     c 1 
     c 1 
     d NA 
     d 3 
     d 3 
     d 3 

Bin ich verpflichtet, eine Schleife zu tun, oder gibt es ein Motto, das gleiche zu tun? Danke!

Antwort

3

Ja, es ist ein Einzeiler:

DT[x != shift(x), v := NA] 


    x v 
1: a 1 
2: a 3 
3: a 3 
4: b NA 
5: b 4 
6: c NA 
7: c 1 
8: c 1 
9: d NA 
10: d 3 
11: d 3 
12: d 3 

Siehe ?shift und the data.table vignettes Informationen zu dieser Syntax.


Alternativ zu vermeiden shift und den vollständigen != Vergleich Berechnung ...

DT[DT[, if (.GRP > 1L) .I[1L], by=rleid(x)]$V1, v := NA ] 

folgende @eddi's approach to subsetting by group. Einzelheiten siehe ?.GRP, ?.I und ?rleid.

+1

Funktioniert perfekt, sehr hilfreich, danke! –

Verwandte Themen