r - शामिल होने के आधार पर data.table का उपस्तरीय अपडेट करें




join subset (2)

मेरे पास दो डेटा तालिकाओं, डीटी 1 और डीटी 2 हैं:

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

मैं DT2 के साथ जुड़ने के आधार पर डीटी 1 को अपडेट करना चाहता हूं, लेकिन केवल डीटी 1 के सबसेट के लिए उदाहरण के लिए, DT1[id1==3] , मैं उम्मीद करता हूं कि पंक्ति 4 में v1 के मान को निम्न परिणाम के रूप में अद्यतन किया जाना है:

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

मैं जानता हूं कि टेबल को कैसे अपडेट किया जाए ( := असाइनमेंट ऑपरेटर का उपयोग करके), तालिकाओं ( DT1[DT2] ) में कैसे शामिल होना और एक तालिका ( DT1[id1==3] को कैसे सेट करना है)। हालांकि मुझे यकीन नहीं है कि एक बार में सभी तीनों को कैसे करना है

संपादित करें: ध्यान दें कि मूल उदाहरण केवल एक कॉलम को अपडेट करने का प्रयास करता है, लेकिन मेरे वास्तविक डेटा के लिए कई स्तंभों को अपडेट करने की आवश्यकता होती है। डीटी 1 बी और डीटी 2 बी में अतिरिक्त परिदृश्यों पर विचार करें:

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

@ एनएमएल और @ ब्ल्यू मैजिस्टर से उपयोगी उत्तर के आधार पर, मैं अद्यतन समाधान के लिए इस समाधान के साथ आया हूं:

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

मैं सबसे आसान तरीका id1 रूप में अच्छी तरह से कुंजी के बारे में सोच सकता है जैसे

setkey(DT1, id2,id1)
DT2[, id1 := 3]
setkey(DT2, id2, id1)

# use i.v1 to reference v1 from the i component
DT1[DT2, v1 := i.v1 ]


DT1
   id1 id2        v1
1:   2   e 0.7383247
2:   1   g 1.5952808
3:   2   j 0.3295078
4:   3   n 0.0000000
5:   3   s 0.5757814
6:   1   u 0.4874291

यह मॉनल के समाधान के समान है लेकिन दूसरी कुंजी के बजाय ifelse का उपयोग करता है

DT1[DT2, v1  := ifelse(id1==3, i.v1, v1),nomatch=0]




assignment-operator