2015-03-05 11 views

Odpowiedz

9

W tej chwili sposobem obejścia tego problemu byłoby najpierw wyodrębnienie indeksów, a następnie wykonanie jednego przypisania przez odniesienie.

idx = DT[, .(idx = .I[c(1L, .N)]), by=class]$idx 
DT[idx, v := NA] 

Spróbuję dodać ten przykład do winiety Reference semantics.

+0

Drugie polecenie można wykonać za pomocą polecenia 'set (DT, j =" v ", i = idx, value = NA)', prawda? Wiedziałbyś lepiej niż ja, czy to jest szybsze. – Frank

+1

@Frank, jeśli robisz to w kółko, tak 'set()' byłoby szybsze, ponieważ nie ma narzuceń na "[.data.table". Nie powinno to mieć znaczenia tutaj. – Arun

1

Dzięki funkcji pomocnika łatwo

set.na = function(x,y) {x[y] = NA; x} 
DT[, set.na(v,c(1,.N)) , by=class] 
0

kanoniczny sposób zmodyfikować podzbiorów danych jest użycie i zdefiniować podzbiór. Nie można używać [ razem z :=. Utwórz tymczasowy kod i zgodnie z sugestią @David Arenburg lub możesz samodzielnie utworzyć wektor wyników przy użyciu konstrukcji c(NA, v[-c(1, .N)], NA).

DT[, v := c(NA, v[-c(1, .N)], NA)[1:.N], by = class] 

Należy jednak pamiętać, że kolejność rzędów może się zmienić, gdy np. ustaw nowy klucz lub użyj dowolnej liczby funkcji. Dlatego powinieneś bardzo uważać na tę operację.

3

To nie może być jedno-liner, ale ma „pierwszy” i „ostatni” w kodzie :)

> DT <- data.table(v = rnorm(12), class=rep(1:3, each=4)) 
> setkey(DT, class) 
> classes = DT[, .(unique(class))] 
> DT[classes, v := NA, mult='first'] 
> DT[classes, v := NA, mult='last'] 
> DT 
      v class 
1:  NA  1 
2: -1.8191  1 
3: -0.6355  1 
4:  NA  1 
5:  NA  2 
6: -1.1771  2 
7: -0.8125  2 
8:  NA  2 
9:  NA  3 
10: 0.2357  3 
11: 0.3416  3 
12:  NA  3 
> 

zamówienia jest również zachowany dla non-kolumn klucza. Myślę, że jest to udokumentowana (zobowiązana do) funkcja.

Powiązane problemy