r data.table, как выполнить поиск из другой таблицы data.table - PullRequest
1 голос
/ 09 июля 2020

Приведенный ниже код делает то, что я хочу для простой таблицы. Отображение, которое имеет место в операторе с on, работает отлично. Но у меня также есть ситуация с несколькими странами, которые должны быть потенциально назначены нескольким регионам, и результат, хранящийся в столбце регионов, более сложен

library(data.table)
testDT <- data.table(country = c("Algeria", "Egypt", "United States", "Brazil"))
testDTcomplicated <- data.table(country = c("Algeria, Ghana, Sri Lanka", "Egypt", "United States, Argentina", "Brazil"))
regionLookup <- data.table(countrylookup = c("Algeria", "Argentina", "Egypt", "United States", "Brazil", "Ghana", "Sri Lanka"), regionVal = c("Africa", "South America", "Africa", "North America", "South America", "Africa", "Asia"))
testDT[regionLookup, region := regionVal, on = c(country = "countrylookup")]
> testDT
         country        region
1:       Algeria        Africa
2:         Egypt        Africa
3: United States North America
4:        Brazil South America

Я бы хотел, чтобы testDTcomplicated выглядел следующим образом

> testDT
             country                          region
    1:       Algeria, Ghana, Sri Lanka        Africa, Africa, Asia
    2:       Egypt                            Africa
    3: United States, Argentina, Brazil       North America, South America, South America
    4:        Brazil                          South America

1 Ответ

3 голосов
/ 09 июля 2020

Вы можете разделить данные запятыми и выделить каждую страну в отдельную строку, объединить данные с помощью regionLookup и снова свернуть их в одно значение в строке, разделенной запятыми.

library(data.table)

testDTcomplicated[, row := seq_len(.N)]
new <- splitstackshape::cSplit(testDTcomplicated, 'country', ',', 
        direction = 'long')[regionLookup, region := regionVal, 
         on = c(country = "countrylookup")]
new <- new[, lapply(.SD, toString), row][,row:=NULL]

new
#                     country                       region
#1: Algeria, Ghana, Sri Lanka         Africa, Africa, Asia
#2:                     Egypt                       Africa
#3:  United States, Argentina North America, South America
#4:                    Brazil                South America

То же logi c in dplyr может быть реализовано как:

library(dplyr)

testDTcomplicated %>%
   mutate(row = row_number()) %>%
   tidyr::separate_rows(country, sep = ", ") %>%
   left_join(regionLookup, by =  c("country" = "countrylookup")) %>%
   group_by(row) %>%
   summarise(across(.fns = toString))
...