Manejo de datos

Tuesday, March 09, 2016

Gestión de Datos

En este capítulo se revisaran importantes tareas de la gestion de datos, incluyendo su estructura, creación de variables y manipulación de datos. Se estudiaran funciones de los paquetes dplyr y tidyr

with(ds, mean(D))
## [1] 11.11765
mean(ds$D)
## [1] 11.11765

La primera instrucción indica que dentro del dataframe ds calcule la media de la variable D, mientras que la segunda instrucción utiliza el operador $ para indicar que del dataframe ds calcule la media de la variable D.

Nombres de las variables y su tipo

Hay situaciones en el que se desea conocer el nombre de las variables y su tipo dentro del dataframe para ello usamos el comando:

str(ds)
## Classes 'tbl_df', 'tbl' and 'data.frame':    17 obs. of  14 variables:
##  $ id    : num  10 11 12 13 14 15 16 17 18 19 ...
##  $ B     : num  542 655 701 606 440 ...
##  $ C     : num  1 0 0 2 0 0 2 0 5 0 ...
##  $ D     : num  1 1 8 8 8 1 1 1 12 13 ...
##  $ E     : num  54.2 59.6 58.5 46.6 31.4 ...
##  $ CEDULA: chr  "V-18659730" "V-18659731" "V-18659732" "V-18659733" ...
##  $ G     : num  7 11 14 44 26 26 23 18 33 37 ...
##  $ H     : num  5 12 99 97 55 12 12 82 92 104 ...
##  $ I     : num  0 0 13 0 0 0 0 0 8 14 ...
##  $ J     : num  1 0 4 4 4 4 4 4 4 5 ...
##  $ K     : num  1 0 0 0 0 0 0 0 0 2 ...
##  $ L     : num  378 649 812 2024 806 ...
##  $ Fecha : POSIXct, format: "1988-06-11" "1994-07-19" ...
##  $ N     : num  54 59 58 46 31 43 43 63 45 45 ...

Acceder a un dataframe mediante indexación

Se pueden utilizar el comando [,] para seleccionar mediante los indices de las columnas o filas los datos que se deseen de la matriz, seleccionemos las primeras 10 filas y todas las columna:

ds[1:10,] 
##    id         B C  D        E     CEDULA  G   H  I J K    L      Fecha  N
## 1  10  542.2583 1  1 54.22583 V-18659730  7   5  0 1 1  378 1988-06-11 54
## 2  11  655.1672 0  1 59.56066 V-18659731 11  12  0 0 0  649 1994-07-19 59
## 3  12  701.4933 0  8 58.45777 V-18659732 14  99 13 4 0  812 2016-04-12 58
## 4  13  605.9284 2  8 46.60988 V-18659733 44  97  0 4 0 2024 1958-09-04 46
## 5  14  439.8299 0  8 31.41642 V-18659734 26  55  0 4 0  806 1987-12-28 31
## 6  15  648.0743 0  1 43.20495 V-18659735 26  12  0 4 0 1118 1987-12-29 43
## 7  16  691.2792 2  1 43.20495 V-18659736 23  12  0 4 0  989 1987-12-30 43
## 8  17 1086.6385 0  1 63.91991 V-18659737 18  82  0 4 0 1134 1987-12-31 63
## 9  18  820.0096 5 12 45.55609 V-18659738 33  92  8 4 0 1485 1988-01-01 45
## 10 19 1011.4978 0 13 45.55609 V-18659739 37 104 14 5 2 1665 1988-01-02 45

Por otra parte se pueden seleccionar todas las filas, en este caso filtremos sólo la segunda columna:

ds[,2]
##  [1]  542.2583  655.1672  701.4933  605.9284  439.8299  648.0743  691.2792
##  [8] 1086.6385  820.0096 1011.4978 1059.2216 1112.1827  791.4187  965.9232
## [15] 1254.7741 1317.3702 1516.7795

Acceder a un dataframe mediante indexación

Igualmente se pueden seleccionar un conjunto de columnas escogamos la segunda, cuarta y séptima:

ds[,c(2,4,7)] 
##            B  D  G
## 1   542.2583  1  7
## 2   655.1672  1 11
## 3   701.4933  8 14
## 4   605.9284  8 44
## 5   439.8299  8 26
## 6   648.0743  1 26
## 7   691.2792  1 23
## 8  1086.6385  1 18
## 9   820.0096 12 33
## 10 1011.4978 13 37
## 11 1059.2216 14 37
## 12 1112.1827 15  8
## 13  791.4187 16 37
## 14  965.9232 17  3
## 15 1254.7741 18 24
## 16 1317.3702 25 19
## 17 1516.7795 30  7

Acceder a un dataframe mediante indexación

Se pueden excluir filas o columnas anteponiendo el signo “-” en el vector de columnas que se desean eliminar:

ds[-c(2,4,7),] 
##    id         B C  D        E     CEDULA  G   H  I J K    L      Fecha  N
## 1  10  542.2583 1  1 54.22583 V-18659730  7   5  0 1 1  378 1988-06-11 54
## 3  12  701.4933 0  8 58.45777 V-18659732 14  99 13 4 0  812 2016-04-12 58
## 5  14  439.8299 0  8 31.41642 V-18659734 26  55  0 4 0  806 1987-12-28 31
## 6  15  648.0743 0  1 43.20495 V-18659735 26  12  0 4 0 1118 1987-12-29 43
## 8  17 1086.6385 0  1 63.91991 V-18659737 18  82  0 4 0 1134 1987-12-31 63
## 9  18  820.0096 5 12 45.55609 V-18659738 33  92  8 4 0 1485 1988-01-01 45
## 10 19 1011.4978 0 13 45.55609 V-18659739 37 104 14 5 2 1665 1988-01-02 45
## 11 20 1059.2216 0 14 53.23672 V-18659740 37 104 14 5 2 1961 1988-01-03 53
## 12 21 1112.1827 0 15 52.96108 V-18659741  8   0  0 0 0  416 1988-01-04 52
## 13 22  791.4187 2 16 35.97358 V-18659742 37  88  0 2 0 1295 1988-01-05 35
## 14 23  965.9232 0 17 41.99666 V-18659743  3  17  0 3 2  123 1988-01-06 41
## 15 24 1254.7741 0 18 52.28225 V-18659744 24  85  0 8 1 1248 1988-01-07 52
## 16 25 1317.3702 8 25 52.69481 V-18659745 19  83  0 6 0  988 1988-01-08 52
## 17 26 1516.7795 9 30 58.33767 V-18659746  7  30  0 5 0  406 1988-01-09 58

Añadir variables creadas a partir de otras

Para esto hay que cargar el paquete dplyr y su respectiva libreria.

Hay dos formas de añadir variables, con el comando mutate, donde definiremos la variable Z a partir de la suma de las columnas “C” y “D”:

ds = mutate(ds, Z=C+D)

o por medio del comando “with”, con el cual hay que tener en cuenta que el nombre de la nueva variable se debe indicar luego del nombre de la data acompañado por “$”, en este caso vamos a llamarla “New”

ds$New = with(ds,D*100)

Renombrar variables en un dataframe:

Se hace con el comando “rename()” el cual es una función de la libreria “dplyr”

ds = rename(ds, new1=C, new2=D) # indica que las variables C y D, han sido renombradas como new1 y new2 respectivamente

o con el comando names()

names(ds)[names(ds)=="Z"] = "new3" #Indica que buscará los nombres de las columnas de ds y el que reciba el nombre Z será renombrado como new3
colnames(ds)<-c("v1","v2","v3","v4","v5","v6","v7","v8","v9","va","vb","vc","vd","ve","vf","vg") # Esta opción es para cambiar los nombres en el encabezado de columnas

Crea variables tipo String a partir de variables numericas

Inicialmente creemos un vector con tres valores numéricos por medio del comando “as. numeric” y verifiquemos que tipo de valores se encuentran el el vector que creamos por medio del comando “typeof()”

numericx=as.numeric(c(1,2,3))
numericx
## [1] 1 2 3
typeof(numericx)
## [1] "double"

Por otra parte vamos a convertir los valores del vector numérico creado anteriormente en caracteres, esto por medio del comando “as.character” y al igual que en el caso anterior verifiquemos que efectivamente son caracteres, en este caso cuando se muestran los valores estarán indicados entre comillas ya que son cadenas.

stringx = as.character(numericx)
stringx
## [1] "1" "2" "3"
typeof(stringx)
## [1] "character"

Convertir variables numéricas a variables tipo string

En este caso vamos a convertir unos valores de tipo cadena o texto en valores numéricos con los comandos vistos anteriormente:

numericx = as.numeric(stringx)
typeof(stringx)
## [1] "character"
typeof(numericx)
## [1] "double"

O incluso puede convertirse los valores en factores o niveles por medio del comando “factor”

stringf = factor(stringx)
typeof(stringf)
## [1] "integer"
stringf
## [1] 1 2 3
## Levels: 1 2 3

Extraer caracteres

Para extraer caracteres se utiliza una función muy parecida a la utilizada en excel, de tal manera de indicar desde que punto se quiere comenzar a extraer los caracteres y cuantos caracteres se van a extraer

x="123456789"
get2through4 = substr(x, start=2, stop=4)
get2through4
## [1] "234"
len = nchar(x) 
len
## [1] 9
x1="ab"
x2="cd"
newcharvar = paste(x1, " VAR2 ", x2, sep="") # Para concatenar string se usa la función paste cuyos argumentos son las cadenas que se desean concatenar, la opción sep es para indicar que tipo de separación se desea
newcharvar
## [1] "ab VAR2 cd"

Para saber si un elemento pertenece a un conjunto de datos, se usa el operador %in%

newengland = c("MA", "CT", "RI", "VT", "ME", "NH") 
"NY" %in% newengland 
## [1] FALSE
"MA" %in% newengland
## [1] TRUE

Dividir string se logra usando el comando strsplit

x = "this is a test" 
strsplit(x, " ")
## [[1]]
## [1] "this" "is"   "a"    "test"

Se usa la instrucción gsub cuyas primera y segunda entrada indican la cadena a reemplazar y por cual será reemplazada, respectivamente

oldstring= "MonaBella"
newstring = gsub("Bella", "Hermosa", oldstring) 
ds$v6<- gsub("-","",paste(ds$v6))

Cuando se desee tener todas las letras de una cadena en minúsculas o mayúsculas, se usan los comandos tolower() y toupper() respectivamente

x="AbcDFGhiklZ"
lowercasex = tolower(x)
lowercasex
## [1] "abcdfghiklz"
lowercasex = chartr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",
                    "abcdefghijklmnopqrstuvwxyz", x)
toupper(x)
## [1] "ABCDFGHIKLZ"

Filtrado de filas es una función de la libreria dplyr, la primera posición de filter() indica la data a filtrar y la segunda posición la condición de filtrado.

#ibrary(dplyr)
smallds = filter(ds,v3==0) 

También se puede usar la función subset(), cuya primera entrada indica de que data se tomará un subconjunto y la segunda entrada la condición

smallds1= subset(ds,v3==1)

-Colocar o mantener variables en un dataframe

Para mantener filas en una dataframe

#ibrary(dplyr)
narrow = select(ds,v1, v2)
#o
narrow1= ds[,c("v1", "v6")]
#o
narrow2= subset(ds, select = c(v1, v2))

Se pueden combinar con las funciones starts_with(), ends_with(), contains(), entre otras.

Muestreo aleatorio de un conjunto de datos

#install.packages("mosaic",dependencies = TRUE)
#install.packages("car",dependencies = TRUE)
#install.packages("pbkrtest",dependencies = TRUE)
library(mosaic)
newds = resample(ds, size=2, replace=FALSE) #Por defecto el muestreo se hace sin reemplazo, en caso de quere reemplezar colocar replace=TRUE
#o
newds1 = ds[sample(nrow(ds), size=2),] # Para obtener una selección aleatoria del numero de filas

Numero de observaciones

library(dplyr)
ds = data.frame(y = c("abc", "def", "ghi")) # Se crea un data frame
ds = mutate(ds, id = 1:nrow(ds)) # El comando mutate se usa para crear una variable en el dataframe a partir de otra variable de este
ds
##     y id
## 1 abc  1
## 2 def  2
## 3 ghi  3
length(ds)
## [1] 2
dim(ds)
## [1] 3 2

Mantener los valores unicos

La función unique() devuelve cada uno de los valores únicos representados por el vector o dataframe indicado por x

x=c(1,2,2,3,4,3,4,3)
y=c(1,2,2,3,3,3,3,3)
uniquevalues = unique(x)
uniquevalues = unique(data.frame(x,y))

Identificar valores duplicados

La función de duplicated() devuelve un vector lógico que indica un valor replicado, la primera ocurrencia no es un valor duplicado

duplicated(x)
## [1] FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE