Determinar os tipos de dados das colunas de um quadro de dados

153

Estou usando R e carreguei dados em um dataframe usando read.csv(). Como determino o tipo de dados de cada coluna no quadro de dados?

stackoverflowuser2010
fonte
Programaticamente (por exemplo, sapply(..., class))ou de forma interativa (por exemplo str(...)) ou ambos? Em geral, é mais escalável para fazê-lo por meio de programação, então você pode arbitrariamente Filter(...)a lista de números inteiros, caracteres, fatores etc. Ou você pode usar grep/greplpara inferir coluna tipos de names(...)se seguir as convenções de nomenclatura
SMCI
@smci: Eu não pedi 'programaticamente' na minha pergunta original. Não sei por que você mudaria toda a natureza da minha pergunta.
stackoverflowuser2010
ok, foi revertido. Não mudou a natureza inteira, esclareceu em uma das duas direções. As abordagens interativas str(...)não são escaláveis ​​e ficam sem vapor em <100 cols.
SMCI

Respostas:

215

Sua melhor aposta para começar é usar ?str(). Para explorar alguns exemplos, vamos criar alguns dados:

set.seed(3221)  # this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5), 
                      x1=c(1:5), 
                      x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                      X3=letters[1:5])

A solução de @Wilmer E Henao H é muito simplificada:

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

Usando str()você obtém essas informações e vantagens extras (como os níveis de seus fatores e os primeiros valores de cada variável):

str(my.data)
'data.frame':  5 obs. of  4 variables:
$ y : num  1.03 1.599 -0.818 0.872 -2.682
$ x1: int  1 2 3 4 5
$ x2: logi  TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

A abordagem de @Gavin Simpson também é simplificada, mas fornece informações ligeiramente diferentes de class():

sapply(my.data, typeof)
       y        x1        x2        X3 
"double" "integer" "logical" "integer"

Para obter mais informações sobre class, typeofe o filho do meio mode, consulte este excelente thread SO: Uma pesquisa abrangente dos tipos de coisas em R. 'mode' e 'class' e 'typeof' são insuficientes .

- Reinstate Monica
fonte
1
Depois de usar o R ​​por vários meses, descobri que str(dataframe)é a maneira mais rápida de determinar os tipos de coluna rapidamente. As outras abordagens exigem mais pressionamentos de tecla e não mostram tanta informação, mas são úteis se os tipos de dados da coluna forem uma entrada para outras funções.
stackoverflowuser2010
Oi quando eu fiz o mesmo com aplicar em vez de aplicar, não funcionou
Dom Jo
@ DomJo, por que você usaria apply()? Isso é para matrizes. Um quadro de dados é uma lista (tipo especial de).
gung - Restabelece Monica
50
sapply(yourdataframe, class)

Onde yourdataframe é o nome do quadro de dados que você está usando

Wilmer E. Henao
fonte
18

eu sugeriria

sapply(foo, typeof)

se você precisar dos tipos reais dos vetores no quadro de dados. class()é uma espécie de animal diferente.

Se você não precisar obter essas informações como um vetor (ou seja, não precisará fazer outra coisa programaticamente mais tarde), basta usar str(foo).

Nos dois casos, fooseria substituído pelo nome do seu quadro de dados.

Gavin Simpson
fonte
7

Basta passar seu quadro de dados para a seguinte função:

data_types <- function(frame) {
  res <- lapply(frame, class)
  res_frame <- data.frame(unlist(res))
  barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}

para produzir uma plotagem de todos os tipos de dados no seu quadro de dados. Para o conjunto de dados da íris , obtemos o seguinte:

data_types(iris)

insira a descrição da imagem aqui

Cibernético
fonte
5

Para pequenos quadros de dados:

library(tidyverse)

as_tibble(mtcars)

fornece uma impressão do df com tipos de dados

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1

Para quadros de dados grandes:

glimpse(mtcars)

fornece uma visão estruturada dos tipos de dados:

Observations: 32
Variables: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17....
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, ...
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6...
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215...
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0...
$ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440...
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90...
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, ...
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, ...
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, ...
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, ...

Para obter uma lista do tipo de dados das colunas (conforme mencionado por @Alexandre acima):

map(mtcars, class)

fornece uma lista de tipos de dados:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

Para alterar o tipo de dados de uma coluna:

library(hablar)

mtcars %>% 
  convert(chr(mpg, am),
          int(carb))

converte colunas mpge amem caracteres e a coluna carbem número inteiro:

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <int>
 1 21        6  160    110  3.9   2.62  16.5     0 1         4     4
 2 21        6  160    110  3.9   2.88  17.0     0 1         4     4
 3 22.8      4  108     93  3.85  2.32  18.6     1 1         4     1
 4 21.4      6  258    110  3.08  3.22  19.4     1 0         3     1
davsjob
fonte
3

Como não foi declarado claramente, apenas adiciono o seguinte:

Eu estava procurando uma maneira de criar uma tabela que contém o número de ocorrências de todos os tipos de dados .

Digamos que temos um data.framecom duas colunas numéricas e uma lógica

dta <- data.frame(a = c(1,2,3), 
                  b = c(4,5,6), 
                  c = c(TRUE, FALSE, TRUE))

Você pode resumir o número de colunas de cada tipo de dados com esse

table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

Isso é extremamente útil, se você tiver muitas colunas e quiser obter uma visão geral rápida.

Para dar crédito: Esta solução foi inspirada na resposta da @Cybernetic .

loki
fonte
2

Aqui está uma função que faz parte do pacote helpRFunctions que retornará uma lista de todos os vários tipos de dados em seu quadro de dados, bem como os nomes de variáveis ​​específicos associados a esse tipo.

install.package('devtools') # Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5), 
                  x1=c(1:5), 
                  x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                  X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric

Você poderia fazer algo assim var(my.data[t$numeric]).

Espero que isso seja útil!

ML_Dev
fonte
1
Vale a pena notar que, por baixo do capô, isso é lapply(your_data, class)um pouco de processamento extra para formatação.
Gregor Thomas
1

Se você importar o arquivo csv como data.frame (e não como matriz), também poderá usar summary.default

summary.default(mtcars)

     Length Class  Mode   
mpg  32     -none- numeric
cyl  32     -none- numeric
disp 32     -none- numeric
hp   32     -none- numeric
drat 32     -none- numeric
wt   32     -none- numeric
qsec 32     -none- numeric
vs   32     -none- numeric
am   32     -none- numeric
gear 32     -none- numeric
carb 32     -none- numeric
DJV
fonte
1

Outra opção é usar a função map do pacote purrr.

library(purrr)
map(df,class)
Alexandre Lima
fonte