Menu

Tipos de Dados em R: numeric, character, logical (typeof e class)

Os tipos de dados atômicos em R - double, integer, character, logical - além da diferença entre typeof() e class() e de como funcionam conversão e coerção.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Os Tipos de Dados em R

Todo valor em R tem um dos poucos tipos atômicos. Quatro deles fazem quase todo o trabalho:

  • double - números decimais: 3.14, -2, 1e6. É isso que R chama de "numeric", e é o padrão para qualquer número que você digitar.
  • integer - números inteiros armazenados de forma exata, escritos com o sufixo L: 42L.
  • character - texto entre aspas: "hello".
  • logical - os dois valores de verdade TRUE e FALSE (mais NA, o valor ausente - veja valores ausentes).

Há também o complex (2 + 3i) para o ocasional cálculo de processamento de sinais; dá para passar anos sem precisar dele. typeof() diz qual tipo um valor tem:

Repare na primeira linha: um número simples é um double mesmo que pareça inteiro. typeof(42) é "double"; apenas 42L é um integer. Na análise do dia a dia a diferença raramente importa - R converte entre eles silenciosamente - mas ela explica boa parte das saídas confusas de typeof().

typeof() vs class(): Por Que Eles Discordam

R tem duas funções que parecem responder "o que é isto?", e elas respondem a perguntas sutilmente diferentes.

  • typeof() informa o tipo de armazenamento: como o valor está na memória.
  • class() informa o tipo comportamental: o rótulo que o despacho de métodos do R usa para decidir, por exemplo, qual print ou summary executar.

Para valores simples, as respostas diferem apenas no vocabulário:

typeof() diz double (o armazenamento), class() diz numeric (o comportamento). Para estruturas, a diferença aumenta:

A matriz é armazenada como um simples vetor de integers, mas se comporta como uma matriz - é o class() que diz ao R para imprimi-la como uma grade. A mesma divisão aparece em data frames (typeof diz "list", class diz "data.frame") e em datas (typeof diz "double", class diz "Date").

A regra prática: use class() quando quiser saber o que algo é no sentido cotidiano, e typeof() quando estiver depurando o que R está fazendo por baixo dos panos.

Verificando Tipos com is.*()

Cada tipo tem um predicado correspondente que retorna TRUE ou FALSE - útil dentro de funções que precisam validar sua entrada:

Uma armadilha que vale conhecer: is.numeric() é TRUE para doubles e integers (ambos são números), mas is.integer() verifica o armazenamento, então é FALSE para um simples 42:

Se você já se surpreendeu com is.integer(7) ser FALSE para um número que é obviamente inteiro no sentido matemático - o motivo é este. 7 é um double; 7L é um integer.

Convertendo Tipos com as.*()

A conversão explícita usa a família as.*, uma função por tipo de destino:

Dois comportamentos para lembrar. as.integer() trunca em direção ao zero em vez de arredondar - 7.9 vira 7. E quando uma conversão não faz sentido, R não lança um erro; ele retorna NA e emite um warning:

Execute isso e você verá NA mais um warning de "NAs introduced by coercion". Isso é genuinamente útil - converta uma coluna inteira de texto bagunçado para números e as entradas não interpretáveis viram NA em vez de derrubar seu script - mas também significa que um NA silencioso pode se infiltrar nos seus dados. Quando uma conversão importa, verifique se surgiram novos NAs depois.

Logicals convertem de e para números do jeito que você esperaria: as.numeric(TRUE) é 1, as.logical(0) é FALSE. É por isso que sum() de um vetor logical conta os TRUEs:

Coerção Implícita: A Regra do Tipo Único para Vetores

Um vetor atômico em R só pode conter um tipo. Combine valores mistos com c() e R promove tudo silenciosamente para o tipo mais flexível presente, seguindo uma escada fixa:

logical → integer → double → character

Os logicals viraram 1 e 0, os integers viraram doubles, e na última linha tudo virou texto - character sempre vence, porque qualquer valor pode ser escrito como string. Você pode confirmar com typeof():

Coerção é a fonte número um dos bugs de "por que minha coluna virou texto?": uma única string "N/A" perdida em uma coluna de números coage o vetor inteiro para character. Quando isso acontecer, corrija primeiro o valor problemático e depois converta de volta com as.numeric().

O Que Você Leva Daqui

  • Quatro tipos que fazem o trabalho pesado: double ("numeric"), integer (42L), character, logical.
  • typeof() = como é armazenado; class() = como se comporta. 3.14 é um double que se comporta como numeric.
  • Verifique com is.numeric() e companhia; converta com as.numeric() e companhia - conversões que falham dão NA com um warning, não um erro.
  • Vetores contêm um único tipo; misturar coage ao longo de logical → integer → double → character.

A seguir: um olhar mais de perto sobre os tipos numéricos - arredondamento, funções matemáticas e as surpresas de ponto flutuante que toda linguagem compartilha.

Perguntas frequentes

Quais são os tipos de dados básicos em R?

Os tipos atômicos são double (números decimais, o que R chama de "numeric"), integer (números inteiros escritos com o sufixo L, como 42L), character (texto entre aspas), logical (TRUE/FALSE) e o raramente usado complex. Tudo que é maior - vetores, data frames, listas - é construído a partir deles.

Qual é a diferença entre typeof() e class() em R?

typeof() informa como um valor é armazenado na memória (seu tipo de baixo nível); class() informa como o valor se comporta, o que controla quais métodos R despacha. Para um decimal simples, eles discordam na terminologia - typeof(3.14) é "double" enquanto class(3.14) é "numeric" - e para estruturas como data frames, typeof() diz "list" enquanto class() diz "data.frame".

Como converter tipos em R?

Use a família as.*: as.numeric("3.5")3.5, as.character(42)"42", as.integer(7.9) trunca para 7. Quando uma conversão é impossível, R retorna NA e emite um warning em vez de um erro - as.numeric("abc") é NA.

O que é coerção em R?

Quando você combina tipos diferentes em um vetor, R converte tudo silenciosamente para o tipo mais flexível, seguindo a ordem logical → integer → double → character. Assim, c(1, 2, "three") vira um vetor de character: "1" "2" "three".

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR