Diferenças de classes no R

A dúvida a seguir foi enviada por um aluno do nosso curso R para Ciência de Dados 1 e estou colocando aqui pois a resposta pode ajudar outras pessoas.

Eu gostaria de entender a diferença entre double, numeric e integer quanto a funcionalidades e memória. O mesmo para charecter e factor.
Além disso, qual a diferença entre as funções type(), mode(), storage() e class()?

Resumindo uma resposta que poderia virar um livro :stuck_out_tongue:

Tipos de dados:

  • integer serve para números inteiros, ou seja, sem vírgula
  • double serve para precisão dupla, ou seja, números grandes e/ou com vírgula
  • numeric é um guarda-chuva do R que inclui integer e double
  • character serve para sequências de caracteres, ou seja, textos
  • factor serve para categóricas, ou seja, “números com nomes”

Funções de caracterização:

  • typeof() serve para dizer como um objeto está sendo armazenado
  • mode() é igual a typeof(), mas não diferencia entre numéricos
  • storage() não existe, mas str() retorna um resumo do objeto
  • class() serve para dizer a classe S3 do objeto, ou seja, o seu “tipo”

Exemplos:

# Pacote para explorar objetos
# install.packages("pryr")
library(pryr)

# Os objetos
num <- numeric(1000)
dbl <- double(1000)
int <- integer(1000)
chr <- character(1000)
fct <- factor(chr)

# Doubles são ~2x maiores
object_size(num)
#> 8.05 kB
object_size(dbl)
#> 8.05 kB
object_size(int)
#> 4.05 kB

# Numeric é um genérico (igual a double por padrão)
numeric
#> function (length = 0L) 
#> .Internal(vector("double", length))
#> <bytecode: 0x55b2a64d9978>
#> <environment: namespace:base>

# Factors têm uma representação eficiente
object_size(chr)
#> 8.1 kB
object_size(fct)
#> 4.5 kB

# A typeof() retorna a forma de armazenamento
typeof(int)
#> [1] "integer"
typeof(fct)
#> [1] "integer"

# A mode() é igual a typeof() mas não diferencia numéricos
mode(int)
#> [1] "numeric"
mode(fct)
#> [1] "numeric"

# A class() retorna o tipo do objeto (classe S3)
class(int)
#> [1] "integer"
class(fct)
#> [1] "factor"

Created on 2021-03-03 by the reprex package (v1.0.0)