# Introducción a R ##2 (slide) # Realice las siguientes operaciones: # Ponga el cursor en esta línea y presione Ctrl Enter x <- c(10.4, 5.6, 3.1, 6.4, 21.7) x assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7)) c(10.4, 5.6, 3.1, 6.4, 21.7) -> x 1/x y <- c(x, 0, x) ##3 #Realice: x<-c(1,2,3); y<-c(x,0,x) v <- 2*x + y + 1 #Warning!! v #Pero hizo algo. ¿Qué hizo? # Otras funciones: +, -, *, /, ^, log, exp, sin, cos, tan, sqrt # Realice: c(min(x), max(x), length(x), sum(x), prod(x), mean(x), var(x)) #var(x) es equivalente a: sum((x-mean(x))^2)/(length(x)-1) ##4 #Secuencias equivalentes: 1:30 ; seq(1,30); seq(from=1, to=30); seq(from=1, to=30) seq(-5, -2, by=.2) ; seq(length=16, from=-5, by=.2) #Formas simples de rep(): rep(x, times=5) rep(x, each=5) ##5 x = 1:10 ; x x > 7 # Otros operadores lógicos: <, <=, >=, ==, != x < 7 x <= 7 x >= 7 x == 7 x != 7 # and & , or | , y not ! x>7 & x<=9 !(x>7 & x<=9) x>7 | x<=9 ##6 #Not avaliable: NA z <- c(1:3,NA) ; z is.na(z) #Ojo, Son diferentes z==NA e is.na(z) z==NA # trata de evaluar igualdad entre un valor que existe contra algo que no existe, y responde NA, porque el valor de la derecha no existe (compara cosas incomparables) is.na(z) # evalúa si es el valor es NA #Not a Number: NaN 0/0 ; Inf - Inf 0/0 Inf - Inf #Son diferentes is.na() e is.nan() zz <- c(z,NaN); zz is.na(zz) is.nan(zz) ##7 #Prueben: "Hello" ; 'world!' # "" y '' funcionan de igual forma palabras <- c("Hello" , 'world!') # son dos cadenas "strings" separados palabras palabras[1] palabras[2] paste("Hello" , 'world!') #forma una única cadena y agrega un espacio paste("Hello" , 'world!', sep="") #ídem, pero quita el espacio paste(c("X","Y"), 1:10) #va uniendo uno a uno dos vectores, como son de distinto largo, repite el vector más corto. Genera un nuevo vector. paste(c("X","Y"), 1:10, sep="") # ídem, pero quita los espacios ##8 # Otras estructuras de Datos ##9 # Matrices z = 1:30 dim(z) <- c(3,5,2) # matriz vacía de dimensiones 3x5x2 #observe z y entienda que es una matriz tridimensional #observe el orden en que se ponen los números 1:30 z z[3,2,1] z[3,2,2] z[2,,] z[,2,] z[,,2] #array como otra forma de definir matrices x <- array(1:20, dim=c(4,5)) x x[,1] x[2,] i <- array(c(1:3,3:1), dim=c(3,2)) ; i ; x[i] #todas las posiciones definidas en i (por fila), se ponen en 0 x[i] <- 0 x y <- x # vean la diferencia entre los productos (t(y) transpone la matriz y) x*y x %*% t(y) #t() indica transpuesta #diag() aplicada a una matriz devuelve los elementos de la diagonal diag(y) #diag() aplicada a un vector genera una matriz cuadrada y vacía con el vector en la diagonal diag(diag(y)) # ¿qué ocurrió aquí? # resolución de sistemas lineales A <- array(runif(4), dim=c(2,2)) #runif() genera números aleatorios con dist. uniforme A b <- runif(2) b solve(A,b) #halla x en A*x = b. Asume que b es vector columna. A debe ser cuadrada ##10 #Listas #Elementos de distinto tipo, a diferencia de las matrices (números, strings, vectores, lógicos, etc.) #Los elementos tienen nombre y valor. Lst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9)) ; Lst #La forma de acceder a los nombres de las listas Lst$wife Lst[["wife"]] x<-"wife"; Lst[[x]] #Los elementos también están numerados Lst[2] Lst[[2]] #Se puede acceder a parte de los elementos de la lista Lst$child.ages[1] Lst[[4]][1] #Se puede agregar alementos a la lista Lst[5] <- list(matrix = array(c(1,2,3,4),dim=c(2,2))) #agrega un quineto elemento más Lst Lst <- c(Lst,Lst) #genera una lista de 10 elementos Lst ##11 #Data frames son Tablas de datos #se crean varios componentes de igual largo x=c(1,2,3,4) y=c("ene","feb","mar","abr") z=list(Numero = c(1,2,3,4),Letra = c("a","b","c","d")) #Se juntan en un único data frame (todos los componentes deben tener el mismo largo) DFrm <- data.frame(Numero=x, Mes=y, Listaz=z) DFrm #Se agrega una nueva columna (columna u) DFrm$u <- 2*DFrm$Numero DFrm attach(DFrm) search() u detach("DFrm") search() u ##13 Importar datos #Conocer el directorio (o folder) de trabajo getwd() #Crear directorio dir.create("workR") #Moverse a ese directorio creado setwd("./workR") #Ir a notepad o notepad++ y crear el archivo houses.data con la siguiente información: # Price Floor Area Rooms Age Cent.heat # 52.00 111.0 830 5 6.2 no # 54.75 128.0 710 5 7.5 no # 57.50 101.0 1000 5 4.2 no # 57.50 131.0 690 6 8.8 no # 59.75 93.0 900 5 1.9 yes #Leer el archivo HousePrice <- read.table("houses.data") HousePrice #Leer nuevamente el archivo HousePrice <- read.table("houses.data", header=TRUE) #Observe la diferencia HousePrice ##14 Importar datos (archivo .csv) #Ir a notepad o notepad++ y crear el archivo houses.csv con la siguiente información: # Price,Floor,Area,Rooms,Age,Cent.heat # 52.00,111.0,830,5,6.2,no # 54.75,128.0,710,5,7.5,no # 57.50,101.0,1000,5,4.2,no # 57.50,131.0,690,6,8.8,no # 59.75,93.0,900,5,1.9,yes HPCSV <- read.table("houses.csv") HPCSV HPCSV[1] #observe la diferencia HPCSV <- read.table("houses.csv", header=TRUE) HPCSV HPCSV[1] #observe la diferencia HPCSV <- read.table("houses.csv", sep = ",",header=TRUE) HPCSV HPCSV[1] ##14 #Ir a notepad o notepad++ y crear el archivo input.dat con la siguiente información: # 52.00 111.0 830 no # 54.75 128.0 710 no # 57.50 101.0 1000 no # 57.50 131.0 690 no # 59.75 93.0 900 yes #Crea una lista inp <- scan("input.dat",list(0,0,0, "")) inp #Crea una lista y nombra cada elemento inp <- scan("input.dat", list(Price=0, Floor=0, Area=0, Cent.heat="")) inp inp$Price inp$Cent.heat #Permite editar un data frame HousePrice xnew <- edit(HousePrice) xnew #Permite crear un data frame xnew <- edit(data.frame()) xnew ##17 Salvar variables #Almacenar variables de trabajo. save(xnew, HousePrice, file = "stuff.RData"); #Se eliminan las variables del ambiente de trabajo rm(xnew,HousePrice) xnew HousePrice #Se recuperan las variables load("stuff.RData") xnew HousePrice #Salvar todo el entorno de trabajo (Global Environment). save.image(file="TodosLosDatos.Rdata") #Borrar todo el entorno de trabajo ls() rm(list = ls()) ; #borra todas las variables #Recuperar todo el entorno de trabajo load("TodosLosDatos.RData") ls()