Curso
Você pode ter encontrado esse erro ao programar no R: Error: non-numeric argument to binary operator
. Isso pode ocorrer quando você executa uma operação matemática em dados que contêm valores não numéricos, como cadeias de caracteres ou caracteres.
Neste tutorial, orientarei você sobre como lidar com esse erro e corrigi-lo. Primeiro, darei uma resposta curta e, em seguida, me aprofundarei para que você possa entender melhor por que esse erro ocorre.
A resposta curta: Como corrigir o erro de argumento não numérico para operador binário no R
Para quem tem pressa, a correção do erro de argumento não numérico para operador binário no R envolve a conversão de dados para tipos numéricos antes de realizar operações aritméticas. Esse método garante que todos os elementos em seus dados sejam adequados para cálculos matemáticos.
No exemplo a seguir, a função as.numeric()
converte diretamente o vetor characters
em numérico, garantindo que a operação de adição seja realizada sem erros.
characters <- c("5", "10", "15")
characters <- as.numeric(characters)
result <- characters + 10
print(result)
Por que o erro ocorre
No R, as operações aritméticas são projetadas para trabalhar com tipos de dados numéricos. Quando você encontra o argumento não numérico para o erro de operador binário, isso normalmente indica o uso indevido de operadores aritméticos com tipos de dados não numéricos, como cadeias de caracteres ou fatores. Para saber mais sobre os tipos de dados do R, leia nosso tutorial Tipos de dados no R.
Isso pode ocorrer em vários cenários comuns:
- Operações em cadeias de caracteres: O erro pode ocorrer ao tentar executar aritmética em dados de texto.
- Operações em tipos de dados de fator: O erro ocorre quando o R converte cadeias de caracteres em fatores dentro de quadros de dados, especialmente ao importar dados, levando a tipos não numéricos não intencionais.
- Operações em listas ou outras estruturas complexas: O erro também ocorre quando você usa operadores aritméticos em listas ou estruturas semelhantes inadequadas para essas operações.
Como reproduzir e corrigir o erro
Vamos criar um conjunto de dados simples e executar operações que acionem intencionalmente esse erro para ilustrar como ele pode ocorrer. Em seguida, corrigiremos o erro em cada caso.
Como reproduzir e corrigir o erro para cadeias de caracteres
Em nosso primeiro exemplo, vemos essa mensagem de erro porque os elementos do vetor characters
não são do tipo numérico, mas sim cadeias de caracteres.
characters <- c("5", "10", "15")
result <- characters + 10
print(result)
Para corrigir isso, convertemos para numérico usando as.numeric()
:
characters <- c("5", "10", "15")
characters <- as.numeric(characters)
result <- characters + 10
print(result)
Como reproduzir e corrigir o erro por fatores
Em nosso próximo exemplo, reproduziremos o erro para os fatores.
factors <- factor(c("5", "10", "15"))
result <- factors + 10
print(result)
Para corrigir isso, convertemos para numérico primeiro convertendo para caractere. Fazemos isso porque, no R, os fatores são armazenados como vetores inteiros com um conjunto correspondente de níveis de caracteres.
Quando você converte um fator diretamente em numérico usando as.numeric()
, o R retorna os códigos inteiros subjacentes, que são a representação interna de números inteiros dos níveis do fator, em vez dos valores reais dos caracteres. A conversão do fator em um caractere primeiro recupera os níveis reais como cadeias de caracteres, que podem então ser corretamente convertidos em valores numéricos.
factors <- factor(c("5", "10", "15"))
factors <- as.numeric(as.character(factors))
result <- factors + 10
print(result)
Como reproduzir e corrigir o erro nas listas
Em nosso próximo exemplo, reproduziremos o erro para listas.
list_data <- list("5", "10", "15")
result <- list_data + 10
print(result)
Para corrigir isso, extraímos e convertemos os elementos em numéricos. A função unlist()
converte a lista em um vetor.
list_data <- list("5", "10", "15")
list_data <- as.numeric(unlist(list_data))
result <- list_data + 10
print(result)
Como reproduzir e corrigir o erro para tipos de dados mistos
O próximo exemplo é um pouco mais complicado. Nenhuma de nossas técnicas anteriores funcionaria nesse caso, pois encontraríamos "20a"
que não pode ser convertido em um valor numérico.
A função sapply()
oferece uma boa solução para esse caso. Ele aplica uma função especificada a cada elemento do nosso vetor. No nosso caso, definimos uma função que tenta converter cada elemento em um valor numérico.
mixed_data <- list("5", 10, "15", "20a")
numeric_data <- sapply(mixed_data, function(x) {
if (is.numeric(x)) {
return(x)
} else if (!is.na(as.numeric(x))) {
return(as.numeric(x))
} else {
return(NA)
}
})
result <- numeric_data + 10
print(result)
Para obter mais informações sobre programação funcional em R, confira nosso curso Programação funcional intermediária com Rurr. Para saber mais sobre a família de funções apply()
, leia nosso Tutorial sobre a família R Apply.
Coisas adicionais que você deve saber
Depuração com traceback
Quando ocorre um erro, o site traceback()
pode ser uma ferramenta valiosa para a depuração. Ele fornece uma sequência de chamadas que levaram ao erro, ajudando você a identificar o ponto exato da falha.
traceback()
Depois de executar esse comando, o R imprimirá a sequência de chamadas de função que levaram ao erro. Isso pode fornecer informações sobre onde os dados não numéricos podem ter sido introduzidos.
Revisar os métodos de entrada de dados
Talvez você também queira verificar novamente como os dados são importados e garantir que sejam convertidos corretamente. Ao importar dados, especialmente de arquivos CSV, o R pode converter automaticamente dados de caracteres em fatores. É importante controlar esse comportamento para garantir que seus dados sejam importados corretamente.
# Assuming data is read from a CSV incorrectly imported as factors
data <- read.csv("data.csv", stringsAsFactors = TRUE)
data$column <- as.numeric(as.character(data$column))
Neste exemplo, os dados são importados de um arquivo CSV com stringsAsFactors
definido como TRUE
. Em seguida, convertemos a coluna de fator em um caractere e, posteriormente, em numérico para garantir o tipo de dados adequado para operações aritméticas.
Como evitar o erro
Uso de verificações condicionais
Para ajudar a evitar a ocorrência desse erro, tente implementar verificações condicionais para garantir que os tipos de dados sejam adequados para as operações. Verificar o tipo de dados e tratar as conversões necessárias condicionalmente é uma boa prática antes de executar as operações.
No exemplo a seguir, verificamos se os dados são numéricos. Caso contrário, nós o convertemos em numérico antes de prosseguir com a operação aritmética. Isso captura todos os tipos de dados errados e os converte adequadamente em numéricos.
data <- "20"
if(is.numeric(data)) {
result <- data + 10
} else {
data <- as.numeric(data)
result <- data + 10
}
print(result)
Conclusão e recursos adicionais
Espero que este artigo tenha sido útil para resolver seu problema. Erros como o argumento não numérico para o erro do operador binário são comuns na programação, e saber como lidar com eles é importante. Entender os tipos de dados e as conversões adequadas pode ajudar a evitar a ocorrência desse erro.
Para ajudá-lo com o R, você pode consultar nossas folhas de consulta do R ou nosso curso gratuito de Introdução ao R ou, para obter uma compreensão mais profunda, experimente nosso programa R Programming Skill Track.
Perguntas frequentes
O que é um argumento não numérico?
Um argumento não numérico é um valor ou variável que não pode ser interpretado como um número em uma linguagem de programação como o R.
Como posso identificar esse erro em meu código?
A mensagem de erro geralmente inclui a frase "argumento não numérico", o que facilita a identificação.
Esse erro ocorre somente no R?
Não, esse erro também pode ocorrer em outras linguagens de programação. No entanto, a mensagem de erro pode aparecer de forma diferente.
Existe uma maneira de evitar esse erro?
Sim, assegurando que todos os valores e variáveis em seu código sejam compatíveis com o operador específico que está sendo usado.
Posso usar qualquer tipo de operador com argumentos não numéricos?
Não, alguns operadores só podem ser usados com valores numéricos e resultarão nesse erro se você receber argumentos não numéricos.