2017-11-29 38 views
5

पर एक और डेटा तालिका के साथ एक सूची के सभी तत्वों को मर्ज करने के लिए कैसे मैं निम्नलिखित डेटा है:हालत

library(data.table) 

dt1 <- data.table(var1 = c("wk1","wk1","wk2"), 
        var2 = c(1,2,3)) 

dt2 <- data.table(var3 = c("a","b","c"), 
        var2 = c(1,2,3)) 

lista <- list(dt1,dt2) 

dt_main <- data.table(var1 = c("wk1","wk2"), 
         var4 = c(100,200)) 

मैं merge करना चाहते lista के सभी तत्वों को जो dt_maindata.table साथ चर var1 होते हैं, में तो अंत मैं lista चाहते हैं इस तरह देखने के लिए:

dt1 <- data.table(var1 = c("wk1","wk1","wk2"), 
        var2 = c(1,2,3), 
        var4 = c(100,100,200)) 

dt2 <- data.table(var3 = c("a","b","c"), 
        var2 = c(1,2,3)) 

lista <- list(dt1,dt2) 

मैं

की कोशिश की 0
mapply(function(X,Y){ 
    if("var1"%in%names(X)){ 
    X <- merge(X,Y,by="var1") 
    } 
},X=lista,Y=dt_main) 

लेकिन यह काम नहीं करता। कोई मदद ?

उत्तर

4

आप एक lapply का उपयोग करें और समारोह के अंदर मर्ज कर सकते हैं: ऐसा करने का

lapply(lista, function(x) if (!is.null(x$var1)) { 

    #the function checks if there is a var1 column 
    #and if there is, it gets merged to the x data.table 
    return(merge(dt_main, x, by = 'var1', all.x = TRUE)) 

} else { 

    #otherwise it just returns the data.table 
    return(x) 

}) 

# [[1]] 
# var1 var4 var2 
# 1: wk1 100 1 
# 2: wk1 100 2 
# 3: wk2 200 3 
# 
# [[2]] 
# var3 var2 
# 1: a 1 
# 2: b 2 
# 3: c 3 
+3

थोड़ा देर हो चुकी है, बी ut मैं एक अलग भिन्नता के साथ आया था: 'lapply (लिस्टा, समारोह (x) यदि ('var'% नाम में% (x)) एक्स [dt_main, = 'var1' पर, var4: = var4] अन्य सभी एक्स) ' – Jaap

+0

मर्ज करने का एक और अच्छा तरीका :)। उत्तर @ जैप के रूप में पोस्ट करना चाहते हैं? – LyzandeR

+2

किया :-) (और मेरी समाधान में एक प्रकार सही) – Jaap

4

एक कुछ अलग तरह से:

lapply(lista, function(x) if ('var1' %in% names(x)) 
    x[dt_main, on = 'var1', var4 := var4][] 
    else x 
) 

जो देता है:

[[1]] 
    var1 var2 var4 
1: wk1 1 100 
2: wk1 2 100 
3: wk2 3 200 

[[2]] 
    var3 var2 
1: a 1 
2: b 2 
3: c 3