¿Programáticamente (p. Ej., sapply(..., class))Interactivamente (p str(...). Ej. ) O ambos? Por lo general, es más escalable hacerlo programáticamente, luego puede arbitrariamente Filter(...)la lista de enteros, caracteres, factores, etc. O puede usar grep/greplpara inferir tipos de columnas names(...)si siguen alguna convención de nomenclatura
smci
@ smci: No pedí 'programáticamente' en mi pregunta original. No sé por qué cambiarías toda la naturaleza de mi pregunta.
stackoverflowuser2010
ok, fue revertido. No cambió toda la naturaleza, lo aclaró en una de dos direcciones. Los enfoques interactivos que se usan str(...)no son escalables y se quedan sin vapor en <100 cols.
smci
Respuestas:
215
Su mejor apuesta para comenzar es usar ?str(). Para explorar algunos ejemplos, hagamos algunos datos:
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])
La solución de @Wilmer E Henao H es muy simple:
sapply(my.data, class)
y x1 x2 X3
"numeric""integer""logical""factor"
El uso le str()brinda esa información más beneficios adicionales (como los niveles de sus factores y los primeros valores de cada variable):
str(my.data)'data.frame':5 obs. of 4 variables:$ y : num 1.031.599-0.8180.872-2.682$ x1: int 12345$ x2: logi TRUETRUEFALSEFALSEFALSE$ X3: Factor w/5 levels "a","b","c","d",..:12345
El enfoque de @Gavin Simpson también está optimizado, pero proporciona información ligeramente diferente de class():
sapply(my.data, typeof)
y x1 x2 X3
"double""integer""logical""integer"
Después de usar R durante varios meses, descubrí que str(dataframe)es la forma más rápida de determinar los tipos de columna de un vistazo. Los otros enfoques requieren más pulsaciones de teclas y no muestran tanta información, pero son útiles si los tipos de datos de columna son una entrada a otras funciones.
stackoverflowuser2010
Hola, cuando hice lo mismo con aplicar en lugar de aplicar, no funcionó
Dom Jo
@DomJo, ¿por qué usarías apply()? Eso es para matrices. Un marco de datos es una lista (tipo especial).
Gung - Restablece Mónica el
50
sapply(yourdataframe, class)
Donde yourdataframe es el nombre del marco de datos que está utilizando
si necesita los tipos reales de los vectores en el marco de datos. class()es algo así como una bestia diferente.
Si no necesita obtener esta información como un vector (es decir, no necesita que haga otra cosa programáticamente más adelante), simplemente utilícela str(foo).
En ambos casos foose reemplazaría con el nombre de su marco de datos.
# 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>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141
Para marcos de datos grandes:
glimpse(mtcars)
le brinda una vista estructurada de los tipos de datos:
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 obtener una lista del tipo de datos de las columnas (como dijo anteriormente @Alexandre):
convierte columnas mpgy amcaracteres y la columna carben entero:
# 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>12161601103.92.6216.5014422161601103.92.8817.00144322.84108933.852.3218.61141421.462581103.083.2219.41031
Aquí hay una función que forma parte del paquete helpRFunctions que devolverá una lista de todos los diversos tipos de datos en su marco de datos, así como los nombres de variables específicos asociados con ese 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
Entonces podrías hacer algo como var(my.data[t$numeric]).
sapply(..., class))
Interactivamente (pstr(...)
. Ej. ) O ambos? Por lo general, es más escalable hacerlo programáticamente, luego puede arbitrariamenteFilter(...)
la lista de enteros, caracteres, factores, etc. O puede usargrep/grepl
para inferir tipos de columnasnames(...)
si siguen alguna convención de nomenclaturastr(...)
no son escalables y se quedan sin vapor en <100 cols.Respuestas:
Su mejor apuesta para comenzar es usar
?str()
. Para explorar algunos ejemplos, hagamos algunos datos:La solución de @Wilmer E Henao H es muy simple:
El uso le
str()
brinda esa información más beneficios adicionales (como los niveles de sus factores y los primeros valores de cada variable):El enfoque de @Gavin Simpson también está optimizado, pero proporciona información ligeramente diferente de
class()
:Para obtener más información sobre
class
,typeof
y el hijo del mediomode
, vea este excelente hilo SO: una encuesta exhaustiva de los tipos de cosas en R. 'mode' y 'class' y 'typeof' son insuficientes .fuente
str(dataframe)
es la forma más rápida de determinar los tipos de columna de un vistazo. Los otros enfoques requieren más pulsaciones de teclas y no muestran tanta información, pero son útiles si los tipos de datos de columna son una entrada a otras funciones.apply()
? Eso es para matrices. Un marco de datos es una lista (tipo especial).Donde yourdataframe es el nombre del marco de datos que está utilizando
fuente
Yo sugeriría
si necesita los tipos reales de los vectores en el marco de datos.
class()
es algo así como una bestia diferente.Si no necesita obtener esta información como un vector (es decir, no necesita que haga otra cosa programáticamente más adelante), simplemente utilícela
str(foo)
.En ambos casos
foo
se reemplazaría con el nombre de su marco de datos.fuente
Simplemente pase su marco de datos a la siguiente función:
para producir un gráfico de todos los tipos de datos en su marco de datos. Para el conjunto de datos de iris obtenemos lo siguiente:
fuente
Para marcos de datos pequeños:
le da una impresión del df con tipos de datos
Para marcos de datos grandes:
le brinda una vista estructurada de los tipos de datos:
Para obtener una lista del tipo de datos de las columnas (como dijo anteriormente @Alexandre):
da una lista de tipos de datos:
Para cambiar el tipo de datos de una columna:
convierte columnas
mpg
yam
caracteres y la columnacarb
en entero:fuente
Como no se dijo claramente, solo agrego esto:
Estaba buscando una manera de crear una tabla que contenga el número de ocurrencias de todos los tipos de datos .
Digamos que tenemos una
data.frame
con dos columnas numéricas y una lógicaPuede resumir el número de columnas de cada tipo de datos con ese
Esto resulta extremadamente útil, si tiene muchas columnas y desea obtener una visión general rápida.
Para dar crédito: esta solución se inspiró en la respuesta de @Cybernetic .
fuente
Aquí hay una función que forma parte del paquete helpRFunctions que devolverá una lista de todos los diversos tipos de datos en su marco de datos, así como los nombres de variables específicos asociados con ese tipo.
Entonces podrías hacer algo como
var(my.data[t$numeric])
.Espero que esto sea útil!
fuente
lapply(your_data, class)
con un poco de procesamiento adicional para el formateo.Si importa el archivo csv como data.frame (y no como matriz), también puede usar
summary.default
fuente
Otra opción es utilizar la función de mapa del paquete purrr.
fuente