Prezadxs, boa noite!
Preciso de uma ajuda em uma atividade que estou desenvolvendo, mais especificamente ajuda em um join/loop aproximado.
Vou explicar o contexto e qual o objetivo:
Tenho uma base de talhões florestais, nos quais preciso alocar um volume estimado. Para fazer isso uso uma informação chave (estrato) + idade de colheita desse talhão pra gerar um index único, com esse index trago a informação de volume estimado de uma tabela de produção.
Base de talhões
talhao | idade_de_colheita | estrato | index |
---|---|---|---|
ACD001 | 14 | EST01 | EST01-14 |
ACD002 | 15 | EST01 | EST01-15 |
ACD003 | 16 | EST01 | EST01-16 |
ACD004 | 16 | EST01 | EST01-16 |
AFF001 | 14 | EST02 | EST02-14 |
AFF002 | 15 | EST02 | EST02-15 |
AFF003 | 18 | EST02 | EST02-18 |
AFF004 | 18 | EST02 | EST02-18 |
AFF005 | 19 | EST02 | EST02-19 |
AYY001 | 13 | EST03 | EST03-13 |
AYY002 | 13 | EST03 | EST03-13 |
AYY003 | 9 | EST03 | EST03-9 |
A tabela de produção seria minha tabela dimensão, onde tenho vários estratos para várias idades, como pode ser observado em um exemplo hipotético na tabela a seguir:
Tabela de produção
estrato | idade | index | volume_t |
---|---|---|---|
EST01 | 15 | EST01-15 | 388.000 |
EST01 | 16 | EST01-16 | 400.000 |
EST01 | 17 | EST01-17 | 424.000 |
EST01 | 18 | EST01-18 | 462.000 |
EST02 | 16 | EST02-16 | 1.203 |
EST02 | 17 | EST02-17 | 1.239 |
EST02 | 18 | EST02-18 | 1.313 |
EST02 | 19 | EST02-19 | 1.432 |
EST03 | 7 | EST03-7 | 921.000 |
EST03 | 8 | EST03-8 | 976.000 |
EST03 | 9 | EST03-9 | 1064.000 |
EST03 | 10 | EST03-10 | 1192.000 |
EST03 | 11 | EST03-11 | 1371.000 |
O problema que estou tendo se encontra nos talhões que serão colhidos com uma idade que não foi previamente calculada na tabela de produção (TP) , como o talhão ACD001, que será colhido com 14 anos porém a TP só possui informações a partir dos 15 anos, ou o talhão AYY001, que será colhido com 13 anos mas a TP só possui informações desse estrato até 11 anos.
Para esses casos eu preciso pegar a informação mais próxima, no caso do talhão ACD001, pego a informação de 15 anos. No caso do talhão AYY001, pego a informação de 11 anos, sempre a info mais próxima que existe dentro das estimativas.
Estruturei um script simples com dplyr::left_join
quando comecei e ai me dei de cara com esses problemas. Tentei alguns testes com o pacote fuzzyjoin, porém não consegui encaixar nenhuma função que resolvesse meu problema. Outra tentativa que realizei foi fazer o cálculo das distâncias de uma string para outra usando a coluna de “index” na função RecordLinkage::levenshteinSim
, como exemplificado em um trabalho do Julio com a Bruna, disponível no seguinte link: Análise de dados musicais no R (brunaw.com), porém o resultado também não era o que eu precisava.
Por gentileza, alguém tem alguma ideia de como resolver esse problema?
Na prática minha chave de procura é o ESTRATO + IDADE, uso o index mais por facilidade quando está tudo estruturado no excel. O que estou tentando agora é fazer um loop onde encontro a idade mais próxima para cada um dos estratos que não deram match, com isso busco o respectivo estrato dessa idade e refaço o join com uma base auxiliar, entretanto, estou sofrendo pra encaixar o código, então achei que valia a pena compartilhar a situação aqui.
Agradeço muitíssimo qualquer ajuda ou ideia!
Bases de exemplo para facilitar qualquer exploração:
talhoes <- tibble::tribble(
~talhao, ~idade_de_colheita, ~estrato, ~index,
"ACD001", 14L, "EST01", "EST01-14",
"ACD002", 15L, "EST01", "EST01-15",
"ACD003", 16L, "EST01", "EST01-16",
"ACD004", 16L, "EST01", "EST01-16",
"AFF001", 14L, "EST02", "EST02-14",
"AFF002", 15L, "EST02", "EST02-15",
"AFF003", 18L, "EST02", "EST02-18",
"AFF004", 18L, "EST02", "EST02-18",
"AFF005", 19L, "EST02", "EST02-19",
"AYY001", 13L, "EST03", "EST03-13",
"AYY002", 13L, "EST03", "EST03-13",
"AYY003", 9L, "EST03", "EST03-9"
)
tp <- tibble::tribble(
~estrato, ~idade, ~index, ~volume_t,
"EST01", 15L, "EST01-15", 388,
"EST01", 16L, "EST01-16", 400,
"EST01", 17L, "EST01-17", 424,
"EST01", 18L, "EST01-18", 462,
"EST02", 16L, "EST02-16", 1.203,
"EST02", 17L, "EST02-17", 1.239,
"EST02", 18L, "EST02-18", 1.313,
"EST02", 19L, "EST02-19", 1.432,
"EST03", 7L, "EST03-7", 921,
"EST03", 8L, "EST03-8", 976,
"EST03", 9L, "EST03-9", 1064,
"EST03", 10L, "EST03-10", 1192,
"EST03", 11L, "EST03-11", 1371
)
Created on 2022-03-14 by the reprex package (v2.0.1)