Aktualisieren Sie die Teilmenge von data.table basierend auf dem Join

Ich habe zwei Datentabellen, DT1 und DT2:

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

Ich möchte DT1 basierend auf einer Verknüpfung mit DT2 aktualisieren, aber nur für eine Teilmenge von DT1. Zum Beispiel fürDT1[id1==3]Ich würde erwarten, dass der Wert von v1 in Zeile 4 wie im folgenden Ergebnis aktualisiert wird:

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

Ich weiß, wie man eine Tabelle aktualisiert:= Zuweisungsoperator), wie man die Tabellen verknüpft (DT1[DT2]) und wie man eine Tabelle unterteilt (DT1[id1==3]). Ich bin mir jedoch nicht sicher, wie ich alle drei auf einmal machen soll.

BEARBEITEN: Beachten Sie, dass das ursprüngliche Beispiel nur versucht, eine Spalte zu aktualisieren, meine tatsächlichen Daten jedoch eine Aktualisierung vieler Spalten erfordern. Betrachten Sie die zusätzlichen Szenarien in DT1b und 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

Basierend auf den hilfreichen Antworten von @nmel und @BlueMagister habe ich diese Lösung für das aktualisierte Szenario gefunden:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage