У меня есть два кадра данных в R - TABLEA (~ 6000 строк) и TABLEB (~ 30000 строк). Все столбцы имеют символьный формат.
TABLEA: COL1 - COL2 - COL3 - COL4
TABLEB: COL1 - COL2 - COL3 - COL4 - COL5 - COL6 - COL7
Я бы например, добавить 5-й столбец в TABLEA, взяв значения COL1-COL4 для каждой строки в TABLEA и выполнив сопоставление регулярного выражения для TABLEB для тех же столбцов. Затем следует добавить значение COL5 из TABLEB в соответствующую строку TABLEA на COL5.
Я написал для этого функцию и попробовал метод fop-l oop и mapply, но он требует очень долго бегать. Я подозреваю, что моя функция для выполнения поиска ужасно неэффективна и что должен быть лучший способ сделать это.
Любые полезные предложения или советы, как мне этого добиться?
getValue<-function(input1, input2, input3, input4)
{
#filter TABLEB on 4 columns matching the 4 inputs above.
FILTERED <- TABLEB %>% filter(str_detect(input1, COL1)) %>% filter(str_detect(input2, COL2)) %>%
filter(str_detect(input3, COL3)) %>% filter(str_detect(input4, COL4)) %>%
#select the 1st value from column 5, in case of multiple matches
select(COL5) %>% head(1)
VALUE<-as.character(FILTERED$COL5)
#if no match found
if(length(VALUE) == 0) VALUE = "UNKNOWN"
return(VALUE)
}
#for-loop method
for(i in 1:nrow(TABLEA)) {
TABLEA[i, ]$COL5<-getValue(TABLEA[i, ]$COL1, TABLEA[i, ]$COL2, TABLEA[i, ]$COL3, TABLEA[i, ]$COL4)
#mapply method
TABLEA$COL5<-mapply(getValue, TABLEA$COL1, TABLEA$COL2, TABLEA$COL3, TABLEA$COL4)
}