cbind и совпадение в структуре data.frame - PullRequest
3 голосов
/ 28 марта 2020

Поскольку я новичок в пакете , я хотел бы повторить то, что обычно делал бы в структуре ниже, в структуру data.table .

Dta     <- data.frame(Customer = c("Javier","Oscar","Ivan","Peter"),Type_of_Customer=LETTERS[c(1,1:3)])
Dtb     <- data.frame(Customer = c("Javier","Oscar","Ivan","Jack"),Zone=5:8,District=100:103)
Result  <- cbind(Dtb[match(Dtb[,"Customer"],Dta[,"Customer"]),c("Zone","District")],Dta)


ww     <- which(is.na(Result[,"Zone"]))
if(length(ww) > 0){
  Result[ww,"Zone"] <- "Not in Dtb"
}

ww     <- which(is.na(Result[,"District"]))
if(length(ww) > 0){
  Result[ww,"District"] <- "Not in Dtb"
  }

Итак, если бы у меня были Dta и Dtb в качестве структуры data.table, каким был бы путь к go? (Примечание: в реальном примере у меня около 10 миллионов строк, поэтому мне нужно более эффективное по времени решение)

Dta     <- data.table(Custumer = c("Javier","Oscar","Ivan","Peter"),Type_of_Customer=LETTERS[c(1,1:3)])
Dtb     <- data.table(Custumer = c("Javier","Oscar","Ivan","Jack"),Zone=5:8,District=100:103)

Спасибо.

1 Ответ

2 голосов
/ 28 марта 2020

Мы можем использовать соединение on thee 'Custumer' и заменить элементы NA на строку 'Not in' Dtb '

Dtb[Dta, on = .(Custumer)][, c("Zone", "District") := 
    .(as.character(Zone), as.character(District))
     ][is.na(Zone), c("Zone", "District") := "Not in Dtb"][]
#    Custumer       Zone   District Type_of_Customer
#1:   Javier          5        100                A
#2:    Oscar          6        101                A
#3:     Ivan          7        102                B
#4:    Peter Not in Dtb Not in Dtb                C
...