2017-04-16 82 views
0

我有這樣一個data.table:條件插入

w <- data.table(id=c(rep(1:2,each=4)), 
       b=c(rep(1:4,each=1)), 
       c1=c(letters[1:8]), 
       d=c(LETTERS[1:8])) 

現在,我倒是喜歡:

  1. 用於與B> 2每個ID
  2. 有C1等於滯後C1
  3. 有d等於導致d(或NA)
  4. 乙方應NA

所需的輸出是:

> w2 
    id b c1 d 
1: 1 1 a A 
2: 1 2 b B 
3: 1 3 c C 
4: 1 NA b D 
5: 1 4 d D 
6: 1 NA c NA 
7: 2 1 a A 
8: 2 2 b B 
9: 2 3 c C 
10: 2 NA b D 
11: 2 4 d D 
12: 2 NA c NA 

回答

2

你可以總結data.table如你的問題描述,然後添加到原來data.tablerbindlist

使用:

# option 1: 
w.add <- w[, .(b = NA^(b > 2), 
       c1 = shift(c1, fill = NA, type = 'lag'), 
       d = shift(d, fill = NA, type = 'lead')), 
      id][is.na(b)] 

# option 2: 
w.add <- w[, .(b = NA^(b > 2)[b > 2], 
       c1 = shift(c1, fill = NA, type = 'lag')[b > 2], 
       d = shift(d, fill = NA, type = 'lead')[b > 2]), 
      id] 

rbindlist(list(w, w.add))[order(id)] 

給出:

id b c1 d 
1: 1 1 a A 
2: 1 2 b B 
3: 1 3 c C 
4: 1 4 d D 
5: 1 NA b D 
6: 1 NA c NA 
7: 2 1 e E 
8: 2 2 f F 
9: 2 3 g G 
10: 2 4 h H 
11: 2 NA f H 
12: 2 NA g NA