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?
str(...)
não são escaláveis e ficam sem vapor em <100 cols.
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?
str(...)
não são escaláveis e ficam sem vapor em <100 cols.
Respostas:
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
, typeof
e 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 .
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.
apply()
? Isso é para matrizes. Um quadro de dados é uma lista (tipo especial de).
sapply(yourdataframe, class)
Onde yourdataframe é o nome do quadro de dados que você está usando
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, foo
seria substituído pelo nome do seu quadro de dados.
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)
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 mpg
e am
em caracteres e a coluna carb
em 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
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.frame
com 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 .
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!
lapply(your_data, class)
um pouco de processamento extra para formatação.
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
Outra opção é usar a função map do pacote purrr.
library(purrr)
map(df,class)
sapply(..., class))
ou de forma interativa (por exemplostr(...)
) ou ambos? Em geral, é mais escalável para fazê-lo por meio de programação, então você pode arbitrariamenteFilter(...)
a lista de números inteiros, caracteres, fatores etc. Ou você pode usargrep/grepl
para inferir coluna tipos denames(...)
se seguir as convenções de nomenclatura