QUITANDO OBJETOS DEL ENTORNO GLOBAL
rm(list = ls())
R es “case sensitive”: r y R son dos input distintos!
INDICAR DIRECTORY DE TRABAJO
setwd("/Users/nicola/Desktop/train")
Construir un vector. En R, un vector consiste de una secuencia de numeros. Utilizamos la funcion c(), que esignifica “concatenate”
x<-c(10.4, 5.6, 3.1, 6.4, 21.7)
El mando de arriba, la “flechita”, toma el nombre de operador de asignación, e indioca el contenido del objeto que estamos creando.
da igual que se ponga por el otro lado:
c(10.4, 5.6, 3.1, 6.4, 21.7)->x
cualquier mando directo, que no utilize objetos, se ejecuta, se imprime y se pierde
1/x
2+2
print(1/x)
print(2+2)
la función de asignación es ejecutable de otra manera a traves de la función “assign”:
assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))
los objetos son la unidad de analisis minima de R. Si quisieramos y igual a x:
y<-x
si, al contrario, quisieramos concadenar x con si mismo poneindo un 0 entre los dos conjuntos:
y<-c(x,0,x)
vamos construyendo un vector que resulte ser una combinación lineal de x e y:
v <- 2*x+y+1
esto nos dará la combinación, elemento por elemento, del dbole x,, y e 1
r <- min(v)
print(r)
mean <- mean(v)
length <- length(v)
claramente el codigo aquí abajo se corresponde a mean!
sumdivlength <- sum(v)/length(v)
var <- var(v)
o, parecidamente:
squarederr<- (v-mean(v))^2/(length(v)-1)
var2<- sum(squarederr)
secA<- c(1:20)
secA1 <-c(20:1)
secB<-c(2*1:15)
n<-10
secC<-c(1:n-1)
scC1<-c(1:(n-1))
una manera mas rapida de crear secuencias es utilizar el mando “sequence”:
seq1<-seq(1, 30)
seq1<-seq(from=1, to=30)
si estamos interesados en el añadir una periodicidad, pues:
seq2<-seq(0, 10, by=0.5)
seq2<-seq(from=0, to=10, by=0.5)
un vector logico, o vector boleano, verifica condiciones. En este caso, queremos un vector 0/1 que verifique la condicion de interes para el vector X
xupper<-x>13
xlower<-x<13
Existe una funcion que nos restituye una indicacion precisa de los missing values
z<- c(1:3, NA, NA)
missingv<-is.na(z)
claramente un missing value no es un valor incalculable:
0/0
Inf/Inf
Es claramente posible crear un vector no numerico:
ciudad<- c("Fea", "Bonita", "Bonita", "Bonita", "Fea")
Utilizando la función paste() podemos coger un numero idenfinidos de caracteres y concatenarlos como stringas. Con la opción “sep” podemos escoger como separar los elementos del vector (para definir un conjunto CSV por ejemplo) El vector creado repetirá los argumentos concadenados X e Y 10 veces, separandolos con ““.
experiments <-paste(c("X","Y"), 1:20, sep="")
Subconjuntos de un vector se pueden seleccionar añadiendo el nombre del vectore en un idice de vector utilizando las parentesis cuadraras:
imaginamos querer un nuevo vector que contenga todos los elementos de z que no son NA:
z1 <- z[!is.na(z)]
Ahora, otro vecror, donde quiero los elemento de z que no sean NA y que contemporaneamente sean mayores que 1:
z2<-z[!is.na(z) & z>1]
ahora, la misma cosa, pero considerando una suma escalar de 1:
(z+1)[(!is.na(z)) & z>1] -> z3
Seleccionamos los primeros 10. y 3 valores de x
x[1:10]
x[1:3]
x[x<4]
Aquí abajo al contrario, queremos repetir 4 veces una secuencia x y y x:
c("x","y")[rep(c(1,2,2,1), times=4)]
Si quisieramos un vector de valores negativos:
neg<-x[-1]
estaríamos diciendo que queremos todo los valores menos 1
neg1<-x[-(1:2)]
Lo que hicimos numericamente se plica tambien con los strings. Solo hay que crear una etiqueta univoca secuencial utilizando la función “names”: el subconjunto escogido y guardado en el objeto “lunch” finalmente contendrá los valores 5 e 1, “orange” y “apple”
fruit <- c(5, 10, 1, 20)
names(fruit) <- c("naranja", "banana", "manzana", "melocoton")
lunch <- fruit[c("manzana","melocoton")]
Los vectores son los objetos mas importantes, de todas formas hay:
Tras haber creado un vector numerico, la funcion as.digits nos permite convertir el vector numerico en uno de caracteres
z <- 0:9
digits <- as.character(z)
para volver al tipo numerico,:
d<-as.integer(digits)
El largo de un objeto en R representa una caracteristica fundamental, que bajo determinadas condiciones puede obstacular la ejecución de un proceso o una rutina. Vamos creando un vector numerico vacio:
e<-numeric()
ahora comunicamos a R el numero de elementos maximos que e puede contener y damosle 1 elementos, 17:
e[3] <-17
print(e)
Cuando queremos hacer un slice, del largo de una serie, digamos de 10 componentes, necesitamos al contrario la fucnión “length”. Vamos por lo tanto creando un vector alpha, seleccionamos solo los valores pares, y cortamoslo para coger solo los primeros 3 valores.
alpha<-c(1,2,3,4,5,6,7,8,9,10)
alpha <- alpha[2*1:5]
length(alpha) <-3
Existen unas cuantas tipologias de clase para los objetos. “numeric”, “logical”, “character” or “list”, but “matrix”, “array”, “factor” and “data.frame. La función summary() permite un vistazo rapido a las estadisticas del objeto y normalmente funciona contextualmente:
summary(x)
summary(ciudad)
summary(mean)
con la factorización podemos especificar unaclasificacion discreta de los componentes de un vector. Consideramos 30 individuos que vienen de cada uno de las regiones de australia:
state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
"sa", "act", "nsw", "vic", "vic", "act")
statef <- factor(state)
print(statef)
levels(statef)
Función tapply(r) para arrays
Consideramos ahora de tener a nuestra disposición las rentas de los 30 individuos:
rentas <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
59, 46, 58, 43)
para utilizar la factorización de manera de poder calcular el promedio de las rentas por cada estado australiano, podemo utilizar la funcion tapply()
rentamedia<-tapply(rentas, statef, mean)
print(rentamedia)
interesante. Pero no valdría la pena calcular el error estandar? Para hacer eso tenemos que redactar una funcion en R:
errest<- function(x) sqrt(var(x)/length(x))
y volver a utilizar tapply para poder utilizar la función:
rentassde<- tapply(rentas, statef, errest)
print(rentassde)
claramente, la función errest puede programarse sin referirse a la desviacion quadratica como var(x): el error estandar es la raiz cuadrdad de la varianza dividida por el numero de observaciones, pues eso será igual a la desviación estandar dividido por la raiz del nulero de observaciones.
errest2<- function(x) sd(x)/sqrt(length(x))
rentassde2<-tapply(rentas, statef, errest2)
print(rentassde2)
Eso nos da por lo tanto resultados identicos, al cual hemos llegado utilizando distintas funciones.
NOTAR: para ordenar los factores, ordered()
Vamos creando una matriz unitaria 5x5:
beta<-matrix(1, 5, 5)
beta1 <- array(1,5)
beta2<- array(1,5)
betamult<- beta1*beta2
era lo que queriamos? quizas no!
betamult2<-beta1%o%beta2
AHORA SI! el prodocto entre los dos vectores nx1 y 1xn nos ha dado una matriz unitaria nxn!
Un array es un vector multidimensional: un vector de vectores, si queremos definirlo así. Siguiendo el lenguaje de R, un array c(3,4,2) es un array con vectores de 3 elementos. Estos vectores están distribuydos en 4 columnas y 2 lineas) VAMOS POPULANDO PROGRESIVAMENTE EL ARRAY:
arrayprime <- array(c(3,1,6), c(3,4,2))
arrayprime <- array(c(c(3,1,6),c(2,6,7)), c(3,4,2))
arrayprime <- array(c(c(2,1,1), c(2,2,1), c(2,3,1), c(2,4,1),
c(2,1,2), c(2,2,2), c(2,3,2), c(2,4,2)), c(3,4,2))
print(arrayprime)
una combinación de 24 elementos, divididos entre las 3 dimensiones utilizadas.
En lugar de una matriz unitaria, intentamos crear una matrix continua de elmentos que va de 1 a 20
x <- array(1:20, c(4,5))
print(x)
el que sería equivalente a:
y<-matrix(1:20, c(4,5))
print(y)
se trata claramente de matrices, o, de forma equivalente “arrays a dos dimensiones”. Como ya vimos antes, un array es un conjunto multidimensional, al cual podríamos pensar como un conjunto de vectores.
para crear un array a tres linias y 4 columnas con valores de uno a 3 y de 3 a 1, por ejemplo tendríamos:
i<- array(c(1:3,3:1), c(3,2))
print(i)
imaginamos querer sacar, por cualquier razon 12 15 y 18 de la matriz x
x[c(c(12) , c(15) , c(18))]<-0
o, sencillamente:
x[c(12,15,18)]<-0
print(x)
claramente ha funcionado, pero la modifica es de valor, no
posicional. alternativamente, podríamos hacer:
``` j<-array(c(c(4, 3, 2), c(3, 4, 5)), c(3,2))
j1<-as.integer(j) print(j1)
y utilizar esta matriz para aislar un subconjunto de entradas a las cuales cambiar de valor:
x[j] x[j]<-0 print(x)
El resultado obtenido será identico. Notar que, como Gauss, Python y Matlab, R resulta claramente muy sensible
al tamaño de las dimensiones de las matrices. De hecho, creando un nuevo array h e invertiendo las coordinadas
de los puntos que querriamos cambiar:
h<-array(c(c(3, 4, 5), c(4, 3, 2)), c(3,2)) x[h] ``` obtendremos el “famoso” mensaje de error “subscript out of bounds” (hemos pedido un elemento de fila 5 a una matriz que posee solo 4 filas!)
imaginamos querer un unico valor en fila 1, columna 2:
x[1,2]
ahora todos los valores de la columna 2 x[,2] o todos
los valores de la fila 3 x[3,] # EJERCICIO: CREAR UNA
MATRIZ IDENTIDAD 3x3
b<-matrix(c(c(,,), c(,,), c(,,)) , c(,))
print(b)
Una operación vectorial muy importante, que ya hemos mencionado es el producto externo. El producto externo de dos arrays numericos a y b será ub array obtenido concadenando los dos vectores dimensionales del los arrays (acuerdandonos de la importancia del orden de la productoria). el operador especial de producto vectorial es %o%. El producto externo, por definición, es el producto entre todos los posibles valores del primer vector con el segundo.
a<-array(c(2,3), c(2,1))
b<-array(c(4,5), c(1,2))
ab<- a%o%b
abalternative<-outer(a,b,"*")
La función de multiplicación se puede substituir trnaquilamente con
una función entre dos variables. Supongamos querer que f(x,y) =
cos(y)/(1+x^2) se evalue por una grilla de valores formada por las
coordinadas x e y contenidas en a y b. utilizando la función “function”
y la función “outer” obtendríamos: x<-a y<-b
f<- function(x,y) cos(y)/(1+x^2)
z<-outer(x, y, f)
print(z)
El estudiante está libre de verificar que el mapeo ha considerado todas las posibles conbinaciones de x con y (es decir, de a y b), para mapear la función. Parte de esto se encuentra muy importante en las funciones de acti vación e metodos como de p`revisión con machine learning.
Consideramos el detemrinante de una matrix 2x2 (ad-bc) de [a,b;c,d].
Imaginamos que cada entrada sea un entero de 0 a 9. Esto equivale a
encontrar la distribución de probabilidad del determinante cuando cada
digito puede ser elegido indipendentemente con un sorteo uniforme y
aleatorio este tema puede ser solucionado una vez mas con la funciópn
outer: d<-outer(0:9, 0:9) que hemos obtenido? todas las
posibles combinaciones multiplocativas de la serie 0:9 ahora,
construiamos una tabla: en esa, vamos a utilizar la función outer, pero
esta vez con la opción “-” y especificando como los dos elementos de la
combinación la matriz d:
det<-table(outer(d,d,"-")) print(det) notar que la
función “table” no es estrictamente necesaria, pero sin esa todas las
posibles combinaciones se repetirían (no habria frequencia) en 10 tablas
10x10 ``` det2<-outer(d,d,“-”) print(det2)
Miramonos un geafico:
plot(det, xlab=“Determinant”, ylab=“Distribution/Frequency”) ``` se nota como el metodo “plot” utiliza un histograma en lugar de uno scatterplot dado el submetodo table que distribuye los elementos calculados por frequencia. Ahora sabemos que el determinante combinatorio de una 2x2, en condiciones de “casi-normalidad” se distribuye mas o menos como una normal, con unos cuantos casos de que obstaculan la invertibilidad de la matriz (determinante=0, matriz de rango pleno)
Transponer una matriz puede hacerse de dos maneras: o enterarese que ina trasposición solo es un caso peculiar de de permutación (metodo “aperm”) o transponiendo filas y columnas (metodo “t”). Pues:
a1<-aperm(a, c(2,1))
View(a)
View(a1)
b1<-aperm(b, c(2,1))
View(b)
View(b1)
#MULTIPICACION MATRICIAL
Hemos hablado de producto externo, pero en algebra matricial necesitamos de un sistema de combinación que respecte la ortogonalidad (linearidad) de lo valores. El estudiante ya conocerá el producto matricial , cuyo operador en R es %*%. Claramente, según el contexto una matrix nx1 o 1xn vale como un vector equivalente cuando se utiliza esta productoria.
n<-matrix(c(1:4), 2, 2)
View(n)
m<-matrix(c(6,3,8,2), 2, 2)
View(m)
mproduct<-n%*%m
View(mproduct)
el primer elemento de mproduct claramente será 61+33, el segundo 81+32 ……
por supuesto: n%%m != m%%n
mproduct2<-m%*%n
View(mproduct2)
print(mproduct)
print(mproduct2)
Seguimos: creamonos dos vectores:
p<-array(c(2,3), c(2,1))
q<-array(c(4,6), c(2,1))
que pasa intentando una multpilicacion matricial?
mproductpq <-p%*%q
R nos dará otro famoso error “non-conformable arguments”, es decir. error de conformidad entre los miembros del producto. El producto cruzado (crossproduct) o producto de transposición nos soluciona el tema:
mproductpq<- t(p)%*%q
print(mproductpq)
notar que hemos hecho el producto de una 1x2 con una 2x1. El resultado es un valor escalar! Por supuesto, toda la algebra matricial presenta una fuerte sensibilidad posicional. De hecho:
mproductpq2 <-p%*%t(q)
print(mproductpq2)
Nos da como resultado el producto entre una 2x1 y una 1x2, el que equivale a una matriz 2x2!
Solucionar un sistema de ecuaciones lineares, como ya sabemos, implica ejecutar una operación contraria a la multiplicación matricial. Considerando b<-A%*%x y dados solo A y b, el vector x representa el vector de soluciones del sistema. Eso seria de Ax=b a x=A^-1b, que confirma la afirmación mas arriba. R posee un solver basico, el modo “solve()” Vamos a aplicarlo al ejemplo de antes:
solve(mproductpq, t(p))
Muy sencillo: basta utiliar la función eigen(). Con eso se pueden calcular autovalores y autovectores de cualquier matriz simmetrica.La función creerá un objeto lista, en el cual se almanecerán los valores de los autovalores y autovectores:
ev<- eigen(mproductpq)
print(ev$val)
print(ev$vec)
Notar como, hemos creado un elemento nuevo del hlobal environment, nuestra primera LISTA!
Las funciones de union (binding) “rbind” y “cbind” permiten la union por columna o por fila de un set de matrices. cbind() permite la unión de vectores del mismo largo, o matrices con el mismo numero de filas, concadenando los aergumentos de la función.
resultssum<-cbind(mproduct2, mproductpq2)
print(resultssum)
resultssum2<-rbind(mproduct2, mproductpq2)
print(resultssum2)
las funciones de binding pueden ser utiles tambien para agregar elemementos deterministas a un determinado conjunto de valores. Para agregar una columna con valor constante 1 a resultssum, por ejemplo:
resultssumint <-cbind(1, mproduct2, mproductpq2)
print(resultssumint)
resultssumintseq<-cbind(1, 1:4, resultssum2)
print(resultssumintseq)
cbind() y rbind() representan la forma mas sencilla de tratar un vector como una columna o fila de una matriz.
Hay solo que notar que las funciones de concadenacions cbind, rbind respectan las caracteristicas dimensionales de los objetos. La funcion basica de condadenación c() al contrario no, y por lo tanto tras su utilizo el valor dimensional del objeto se pierde. Para moverse con facilidad entre un array y un vector, utilizamos nuevamente la funcion as.(). Notar que la consecuencia directa de este mando, cunado se aplica a un array/matriz, es que la matriz colapsa y pierde una dimension:
vecresultssumintseq<-as.vector(resultssumintseq)
notar como lo mismo pasaría utilizando sencillamente c(): se trata de un efecto segundario de la función de concadenación:
Acuerdamonos que un factor determina una partición de frecuencia en grupos. De forma parecida, dos factores definen una clasificación cruzada, tres una clasificación a tres categorias. Como hemos visto antes, la función table() permite de calcular tablas de frecuencia desde un conjunto de factores de largo identico. Retomamos nuevamente la secuencia de 30 entradas que se refieren a la origen estatal de la renta anual de 30 individuos en Australia. Como ya vimos para la distribución de frecuencia de la permutación del determinante de 0 a 9, intentamos crear una tabla de frecuencia de la distribución por factores de “statef”
statetable<- table(statef)
print(statetable)
lo mismo, por supuesto, se habría obtenido con la función tapply:
statetable2<-tapply(statef, statef, length)
print(statetable2)
Ahora supongamos tener otro factor, la renta de los 30 individuos presentes en nuestros datos. Retomamos por lo tanto nuestra variable “rentas” y partimlas en hasta 7 clases potenciales:
factor(cut(rentas, breaks = 35+10*(0:7))) -> rentasf
finalmente, para crear una tabla de doble entrada:
table(rentasf, statef)
las extensiones a tablas de frecuencias mas altas (o, equivalentemente, con un numero de entradas mas altas) es muy simple!!
1)crear unn nuevo vector contenente hombres (de la entrada 1 a la 15) y mujeres (de la entrada 16 a la 30). Dar valor 0 a hobres y 1 a mujeres
factorizar el vector y su información
Crear una tabla de “triple” entrada
Una lista es un objeto que contiene un conjunto ordenado de objetos. Es una de las maneras mas sencialls de crear una base de datos, y sus componentes no tienen porqué ser objetos de la misma categoria o tipo. La fucnión de creación de una lista es “list()”
Lista <- list(name="Alvaro", mujer="Maria", hijos=3, edad.hijos=c(6,9,11))
los componentes de una lista van siempre por orden. Por lo tanto, para conocer la edad de los hijos de Alvaro y Maria:
print(Lista[4])
o, de forma equivalente, habiendo nosotros etiquetado una componente de la lista:
print(Lista$edad.hijos)
o, de manera equivalente, una vez mas:
Una lista pued llegar a ser mucho mas complicada:
Lista2<- list(name=c("Alvaro", "Federico", "Antonio", "Gennaro"), mujer=c("Maria", "Isabel", "Ofelia", "Ana"), hijos=c(3, 2, 1, 0))
para seleccionar un elemento de la lista, a parte recorrer a “$”, otra posibilidad sería la doble corcheta, etiquetando una nueva variable con la misma etiqueta del objeto que queremos sacar de la lista:
nombres.padres<-Lista2["name"]
father.names<-"name"
Lista2[[father.names]]
notar como en este caso father.names no es un objeto lista: solo es un valor Escalar de string, un “placeholder” para poder llamar los datos con el mismo nombre el la lista de interés.
En general la función lista tiene notacion:
Lst <- list(name_1=object_1, …, name_m=object_m)
Y, como todo lo que se encuentra en el global environment de R, es plenamente modificable (bajo determinadas condiciones)
Imaginamos tener una lista que nos da la condición laboral de Alvaro, Federico, Antonio y Gennaro. 0 por autoempleado, 1 por empleado, 2 por desocupado
Listajob=list(job=c(0,1,1,2))
Juntar esta nueva lista con la información original sería una solucion optimal. La función concadenar “c()” sirve par eso!
Listafinal = c(Lista2, Listajob)
print(Listafinal)
#DATA FRAMES
Un data frame es exactamente un data frame: una estructura para datos. Vajo determinadas condiciones, una lista puede promocionarse a data frame. En estadistica aplicada, los data frames son las bases de datos de trabajo mas comun en r. Para que una lista pueda ser convertida en data frame, tendrá que ser:
un dataframe es practicamente una matriz donde las columnas pueden tener distintas caracteristicas. Es el equivalente algebrico de una lista, y nos permite empezar a utilizar la palabra VARIABLES para hablar de su contenido.
Como podemos imaginar, la función para la creación de un data frame es “data.frame()”:
canadienses<-data.frame(estado=statef, rentabilidad=rentas, freqrentas=rentasf)
View(canadienses)
que tal costruit otro con una lista? Pues la tenemos bien lista, es nuestra “listafinal”!
españoles<-data.frame(data=Listafinal)
View(españoles)
MHHHHHH hay algo raro. La preview del data.frame es lo que nos esperabamos, pero querriamos definir las etiquetas distintamente! Coger elemento por elemento de la lista es una posbile solucion:
españoles2<-data.frame(nombres=Listafinal$name, partners=Listafinal$mujer, niños=Listafinal$hijos, trabajo=Listafinal$job)
View(españoles2)
Nota: para quien no trabaja con R studio, seria
head(españoles2)
para visualizar las primeras entradas del data frame.
Utilizar la notación “$” para aislar, utilizar, guardar componentes deseados de una lista no siempre es comodo. Como se podría utilizar los componentes de una lista, de manera que resulten ser variables con el mismo nombre (etiqueta) del componente, sin la necesitad de llamar siempre la lista? Una solución es la funcion attach().
Sabemos que el data frame “españoles” contienes 4 variables. utilizando attach:
attach(españoles2)
ahora podemos trabajar directamente con los padres de familia, sus partners, los niños y su trabajo sin pasar por la lista!!!!
print(nombres)
o, efectuar cualquier operación que tenga sentido algebrico directamente! ```
print(niños*trabajo) ```
otra cuestión fundamental: utilizar la función de asignación (nuestra flechita), no va a cambiar el contenido de la varaible en el data frame. Sencillamente, esto se mascara con otra variable con la misma etiqueta en el primer nivel de busqueda:
niños<-1+trabajo
El mando de arriba por lo tanto tiene como efecto la aparición de un objeto nuevo con los niuevos valores de niños y el contenido de la lista original y del equivalente data frame, españoles2, se mantiene lo mismo que antes!!!
la unica forma de modificar, tras un attach(), el contenido del data frame original, es volver a la notación “$”:
españoles2$niños<-1+trabajo
Los cambios de este tipo son visibles solo tras el detach!
detach(españoles2)
NOTAR COMO EL ACCESO DIRECTO A LAS VARIABLES YA NO ES POSIBLE: ```
print(nombres) ```
Al print de arriba, R contesterá que no ha encontrado ningún objeto “nombres”, por lo menos nada que esté visible “en superfiz”.
VENTAJAS DEL DATA FRAME
Con search() podeis tener una idea concreta de lo que está attached o detached:
search()
attach(españoles2)
search()
detach(españoles2)
search()
R contiene unos cientos de base de datos listas para ser trabajadas. Para ver una lista completa:
data()
para seleccioanr uno, solo hay que indicarlo. Por ejemplo:
data(trees)
force(trees)
head(trees)
nos restituye un data frame con diametro, altura y volumen de una serie de arboles de cerezas!
Finalmente ha llegado el momento de importar algo desde afuera del entorno de R. Normalmente, suponiendo que los datos esten en formado data frame, es posible leerlos directamente con la función read.table(). Hay Tambien un metodo mas primitivo, la función scan().
Antes de todo, vamos a guardar un data frame con saveRDS()
saveRDS(canadienses, file="canada.Rda")
vamos a borrar canadienes:
rm(canadienses)
y ahora, vamos a cargarlo con readRDS:
```
canadienses=readRDS("canada.Rda")
```
una cuestión importante: saveRDS guarda por defecto por encima del fichero rogiginal!
Hay claramente otras maneras de guardar los datos:
write.csv(españoles2, "españoles2.csv", row.names=FALSE, quote=FALSE)
rm(españoles2)
españoles2 <- read.csv("/Users/nicola/Desktop/train/españoles2.csv", header=TRUE, stringsAsFactors=FALSE)
head(españoles2)
Aquí la cosa se hace ligeramente mas complicada. Al dia de hoy R no tiene ninguna funcionalidad para escribir y cargar ficheros xlsx. Toca descargar e instalar un paquete externo:
install.packages("openxlsx")
library(openxlsx)
write.xlsx(españoles2,'/Users/nicola/Desktop/train/españoles2.xlsx',colNames = TRUE)
rm(españoles2)
españoles2<- read.xlsx('/Users/nicola/Desktop/train/españoles2.xlsx',colNames = TRUE, sheet="Sheet 1", startRow=1)
head(españoles2)
En el ejemplo de arriba hemos cargado un paquete en R con un fichero ejecutivo que nos ha permetido utilizar una función (read.xlsx) normalmente no presente en R.
Ejemplo: para caragar el paquete Tibble:
library(tibble)
El tibble es un objeto parecido al data.frame cuya formatación es un poco mejor:
españolestib<-as.tibble(españoles2)
notar como la vijea notación. as.tibble, no se utiliza mas! Para ver que está pasando, utilizamos el helper de R con el simbolo “?”
?as_tibble
españolestib<-as_tibble(españoles2)
el tibble es un data frame avanzado, resulta esencial para utilizar paquetes avanzados como tidyverse, dplyr, ggplot2, tidyr!
con la funci´n search(), que hemos visto antes, podemos mirar que paquetes tenemos actualemten cargados en el kernel de R:
search()
a veces, hay paquetes que requieren una instalación antes del utilizo a traves de la función library. El como instalarlos depende fondamentalmente da que repositorio vienen:
CRAN (https://CRAN.R-project.org/ and its mirrors)
Bioconductor (https://www.bioconductor.org/).
para instalar un paquete del CRAN (ejemplo gplots):
install.packages("gplots") library(gplots) a veces, es
necesarío utilziar una rutina que no se encuentra en ningun repositorio
comun. En github, sitios de herramientas de desarollo, muchos
investigadores mantienen una pagina personal con los paquestes
desarollados: Un ejemplo (claramente no funcionante!)
devtools::install_github(“folder/tool”) library(tool)