Ho due tabelle di dati, DT1 e DT2:Aggiornamento sottoinsieme di data.table sulla base di unirsi
set.seed(1)
DT1<-data.table(id1=rep(1:3,2),id2=sample(letters,6), v1=rnorm(6), key="id2")
DT1
## id1 id2 v1
## 1: 2 e 0.7383247
## 2: 1 g 1.5952808
## 3: 2 j 0.3295078
## 4: 3 n -0.8204684
## 5: 3 s 0.5757814
## 6: 1 u 0.4874291
DT2<-data.table(id2=c("n","u"), v1=0, key="id2")
DT2
## id2 v1
## 1: n 0
## 2: u 0
vorrei aggiornare DT1 sulla base di un join con DT2, ma solo per un sottoinsieme di DT1. Ad esempio, per DT1[id1==3]
, mi aspetto il valore di v1 nella riga 4 per essere aggiornato come il seguente risultato:
DT1
## id1 id2 v1
## 1: 2 e 0.7383247
## 2: 1 g 1.5952808
## 3: 2 j 0.3295078
## 4: 3 n 0
## 5: 3 s 0.5757814
## 6: 1 u 0.4874291
so come aggiornare una tabella (utilizzando l'operatore :=
assegnazione), come aderire le tabelle (DT1[DT2]
) e come creare un sottoinsieme di una tabella (DT1[id1==3]
). Tuttavia non sono sicuro di come fare tutti e tre contemporaneamente.
EDIT: Si noti che l'esempio originale tenta solo per aggiornare una colonna, ma il mio dati effettivi richiede l'aggiornamento molte colonne. Prendere in considerazione gli scenari aggiuntivi in DT1b e DT2b:
set.seed(2)
DT1b<-DT1[,v2:=rnorm(6)] # Copy DT1 and add a new column
setkey(DT1b,id2)
DT1b
## id1 id2 v1 v2
## 1: 2 e 0.7383247 -0.89691455
## 2: 1 g 1.5952808 0.18484918
## 3: 2 j 0.3295078 1.58784533
## 4: 3 n -0.8204684 -1.13037567
## 5: 3 s 0.5757814 -0.08025176
## 6: 1 u 0.4874291 0.13242028
DT2b<-rbindlist(list(DT2,data.table(id2="e",v1=0))) # Copy DT2 and add a new row
DT2b[,v2:=-1] # Add a new column to DT2b
setkey(DT2b,id2)
DT2b
## id2 v1 v2
## 1: e 0 -1
## 2: n 0 -1
## 3: u 0 -1
Sulla base delle risposte utili da @nmel e @BlueMagister, mi si avvicinò con questa soluzione per lo scenario aggiornato:
DT1b[DT2b[DT1b[id1 %in% c(1,2)],nomatch=0],c("v1","v2"):=list(i.v1,i.v2)]
DT1b
## id1 id2 v1 v2
## 1: 2 e 0.0000000 -1.00000000
## 2: 1 g 1.5952808 0.18484918
## 3: 2 j 0.3295078 1.58784533
## 4: 3 n -0.8204684 -1.13037567
## 5: 3 s 0.5757814 -0.08025176
## 6: 1 u 0.0000000 -1.00000000
Grazie per la risposta e altri commenti, @mnel. Questo approccio funziona per l'esempio originale e può essere facilmente esteso per il caso in cui è necessario aggiornare più colonne anziché una sola. Ma se il sottoinsieme è più complicato (ad esempio 'id1 == 3 | id1 == 2', vedi la domanda aggiornata), sembra che l'aggiunta della chiave id1 a DT2 sia più complicata. – dnlbrky