Присоединить значение к существующей таблице data.table без точного совпадения (совпадение в пределах интервала)

У меня есть столбец в таблице данных (DT1), который является убывающим числом (скажем pol_count), и еще один столбец для среднего возраста населения (скажем AverageAge). Я пытаюсь взять свое значение pol_count (скажем, 400) и мое значение AverageAge (скажем, 85) и сопоставить их с интервалом в таблице с именем FactorFile.

Вот проблеск FactorFile:

Count_Greater_Than  Age_Less_Than   Months  Factor
100                 80              12      1
85                  82              16      0.85
65                  84              20      0.65
45                  86              24      0.45

В этом случае pol_count равно ›100, поэтому он вернет значение третьего столбца (Months), равное 12, а AverageAge равно‹ 86, но ›84, так что он вернет 20. Затем мне нужен другой столбец, чтобы взять максимум, поэтому окончательный ответ будет 20. Наконец, столбец для Factor, связанный с 20, что составляет 65%.

Я не знаю, как присоединиться к столу без точных совпадений. В основном я хочу, чтобы ВПР с последним аргументом как ИСТИНА, чтобы вытащить ближайшее значение к предоставленному значению поиска.

Я пробовал использовать пакет fuzzyjoin, вот мое утверждение. Он работает, но с моей таблицей data.table, похоже, ничего не происходит:

fuzzy_left_join(DT1, FactorFile, by = c("AverageAge" = "Average_Age_Less_Than"), match_fun = `<=`)

Есть какие-нибудь советы о том, как правильно использовать fuzzyjoin или как это сделать проще? Подводя итог, я пытаюсь взять два столбца в DT1 и вернуть столбец месяцев и столбец Factor в DT1, присоединившись к FactorFile.

Спасибо!


person etotheeyepi    schedule 23.06.2020    source источник
comment
Я не знаком ни с одним из них, не могли бы вы расширить?   -  person etotheeyepi    schedule 25.06.2020


Ответы (1)


Может быть, примерно так:

DT1[, c("M1", "F1") := 
    FactorFile[.SD, on=.(Count_Greater_Than=pol_count), roll=Inf, .(Months, Factor)]
]

DT1[, c("M2", "F2") := 
    FactorFile[.SD, on=.(Age_Less_Than=AverageAge), roll=Inf, .(Months, Factor)]
]

DT1[, c("M", "Fac") := {
        mm <- pmax(M1, M2)
        .(mm, fifelse(mm==M1, F1, F2))
    }]

выход:

   pol_count AverageAge M1 F1 M2   F2  M  Fac
1:       400         85 12  1 20 0.65 20 0.65

данные:

library(data.table)
DT1 <- data.table(pol_count=400, AverageAge=85)
FactorFile <- fread("
Count_Greater_Than  Age_Less_Than   Months  Factor
100                 80              12      1
85                  82              16      0.85
65                  84              20      0.65
45                  86              24      0.45")
person chinsoon12    schedule 27.06.2020