2017-01-24 12 views
2

У меня есть кадр данных вроде следующего:R: вставить Nas в одном столбце, если имя переменной в другом столбце изменяется

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 

Что мне нужно сделать, это заменить значение «V» условно, каждый раз переменная «х» меняется, как так:

 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 

ли я обязан делать петлю или есть один вкладыш, чтобы сделать то же самое? Спасибо!

ответ

3

Да, есть один вкладыш:

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 

См ?shift и the data.table vignettes Подробные сведения о синтаксисе.


Попеременно, чтобы избежать вычислений shift и полный != сравнения ...

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

следующих @eddi's approach to subsetting by group. См. ?.GRP, ?.I и ?rleid.

+1

Работает отлично, очень полезно спасибо! –