Quanto é 0.1 + 0.2 ?

Antes de mais nada, acho que qualquer um irá concordar que 0.1 + 0.2 = 0.3. Respondemos a essa pergunta trivialmente, sem pensar duas vezes. Bom, o R também responde a essa pergunta sem a menor das dúvidas.

> 0.1 + 0.2
[1] .3

Sendo assim, se fizermos o teste lógico para ver se 0.1 + 0.2 é igual a 0.3, também já sabemos que será verdadeiro.

> (0.1 + 0.2) == .3
[1] FALSE

Surpreendentemente, o teste dá falso. Isso significa então que o R possui um erro de operação tosco ao ponto de invalidar todos os resultados que eu puder gerar algum dia? Certamente não.

O que acontece aqui é que ao converter o número 0.1 para a base binária a representação deste número passa a ser uma dízima periódica (para ser mais exato 0.0001100110011001100110011001100110011001100110011...) então em algum ponto tem que acontecer um arredondamento. Na verdade outras linguagens são mais sinceras com este resultado. Vejamos o caso de Python, Julia e o próprio R, alterando o número de casas decimais.

In [1]: .1 + .2
Out[1]: 0.30000000000000004

julia> .1 + .2
0.30000000000000004

> print(.1 + .2, digits=20)
[1] 0.30000000000000004441

Comparado a outras linguagens, a diferença aqui fica por conta de que no R o resultado não é explicitamente exibido. Mas é claro que, apesar de não ser igual, a precisão é suficientemente boa.

Medindo a semelhança (ou diferença) entre duas palavras distintas

Há quem diga que, caso existam opções de não se trabalhar com strings, deve-se optar por estas escolhas. Como problemas podemos citar falta de estruturas/padrões a serem seguidos, difícil manipulação, erros de tabulação e por aí vai. Sim, é uma lista grande. Porém existem alguns algoritmos que prometem acabar com algumas destas dificuldades (ou ao menos tornar o problema um pouco mais simples, pelo menos ao ponto de ser trabalhável) e hoje falaremos de um deles, que é o cálculo da distância de edição ou distância de Levenshtein.

Uma aplicação imediata da solução proposta é aplicável ao problema de correção ortográfica. Imagine que você conheça todo o vocabulário de palavras possíveis a serem reportadas na sua aplicação - não é um pressuposto absurdo, uma vez que você pode estar trabalhando em um nicho específico, como por exemplo os nomes de todas as ruas de um determinado bairro ou o nome de todas as empresas cadastradas em algum tipo de sistema - então sua aplicação receberá uma palavra qualquer(w) e irá procurar no vocabulário se esta palavra existe. Se não existir, basta calcular a distância de edição para cada uma das outras palavras e pronto, você terá a recomendação de uma possível palavra para aquela que inicialmente foi escrita errada. Para as aplicações que suportam respostas livres mas que não é possível contar com um vocabulário para consulta, pode-se pegar as palavras que aparecem com baixa frequência e tentar uma aproximação da mesma forma, pois espera-se que uma palavra escrita errada não aparecerá muitas vezes, ao menos não com a mesma grafia. Agora precisamos saber o que é exatamente a distância de edição e como podemos calculá-la.

Visualizando grandes bancos de dados

Já comentamos aqui no blog a importância da visualização dos dados antes de se fazer qualquer análise. Entretanto, nem sempre essa visualização é trivial, seja pelo grande número de variáveis ou pelo grande número de observações. Ao dar plot() em um data.frame com n variáveis, o R gera n² gráficos de dispersão de todas combinações das variáveis. Apesar de ser prático e funcional para variáveis contínuas, ele fica devendo uma maneira funcional de visualizar as variáveis categóricas. O pacote tabplot veio para resolver esse problema