viernes, 27 de diciembre de 2024
Documentos. Automatización.
jueves, 26 de diciembre de 2024
Lenguajes. R.
Vectorización de una matriz
- alumnos <- c(24,22,20,19,21,25)
- mataprob <- c(67,72,84,53,82,79)
Lenguajes.R.
Matriz y array
- curso<-c("P1","P2","P3","P4","P5","P6")
- alumnos <- c(24,22,20,19,21,25)
- mataprob <- c(67,72,84,53,82,79)
Otras funciones que pueden sernos de utilidad para trabajar con matrices son la función class(), que nos permite saber si una colección de datos es considera una matriz (o un array) por R, la función dim(), que nos devuelve el número de filas y columnas de la matriz (o del array) y la función t(), que nos permite trasponer filas-columnas.
Lenguajes. R.
Subconjuntos de un vector
- Un vector con el curso P3 -> curso3 <- curso[3] devuelve "P3"
- Otro con los tres primeros cursos -> curso13 <- curso[1:3] devuelve "P1" "P2" "P3"
- Otro con los cursos impares -> cursosimp <- curso[c(1,3,5)]) devuelve "P1" "P3" "P5"
- Y otro sin los dos cursos finales -> curosinic <- curso[-c(5,6)] devuelve "P1" "P2" "P3" "P4"
Lenguajes. R.
Vectorización
Gracias a la vectorización es posible generar operaciones simples o complejas cuyo resultado afecte a todos los componentes del vector. Los operadores admitidos son los operadores aritméticos y los relacionales.
Para num1 <- c(2,4,6,8,10,12)
num1 * 2 devuelve 4 8 12 16 20 24
num1 < 5 devuelve TRUE TRUE FALSE FALSE FALSE FALSE
numdoble <- num1 * 2
num1 devuelve porque conserva 2,4,6,8,10,12
numdoble devuelve (y conserva) 4 8 12 16 20 24
Lenguajes. R.
Vectores. Definición.
- num <- c(1,3,5,7)
- pal <- c("mesa","silla","cama")
- num <- c(1,3,5,7)
- num <- c(num,9)
miércoles, 25 de diciembre de 2024
Lenguajes. R.
Colecciones de datos
- Vector (una dimensión, datos homogéneos)
- Matriz (dos dimensiones, datos homogéneos)
- Array (n dimensiones, datos homogéneos)
- Lista (una dimensión, datos heterogéneos)
- Data frame (dos dimensiones, datos heterogéneos)
martes, 24 de diciembre de 2024
Lenguajes. R.
Operadores
Al igual que en resto de los lenguajes, también en R podemos diferenciar distintos tipos de operadores: aritméticos, relacionales, lógicos y de asignación.
- Las cuatro operaciones básicas: + , - , * y /
- La división entera: %%, que redondea al entero más próximo y omite la parte decimal
- Y la potenciación: ^, que eleva el número a la n.esima que se indique (2^3)
- x | z -> O lógico (x o z). Devuelve TRUE si alguno de los miembros es TRUE y sólo devuelve FALSE si todos los miembros son FALSE.
- x & z -> Y lógico ( x y z). Devuelve FALSE si alguno de los miembros es FALSE y TRUE sólo cuando todos los miembros son TRUE.
- !x -> Negación lógica (x no es verdadero)
- isTRUE(x) -> Afirmación lógica (x es verdadero)
- ^
- * /
- + -
- < > <= >= == !=
- !
- &
- |
- <-
Lenguajes. R.
Datos y variables
- Caracter (cadena de texto) (character) -> "La casa de la pradera" / "A"
- Enteros (integer) -> 22
- Decimal (numeric) -> 1.35
- Factor (factor) -> uno
- Lógico (logical) -> TRUE/FALSE
- Perdido (NA) -> NA
- Vacío (NULL) -> null
La diferencia entre los datos integer y numeric es que los segundos son números con parte decimal, por lo que también se les conoce como float (coma flotante).
La característica principal de los datos string/character es que van entrecomillados.
Un factor es un datos específico de R y se puede definir como un datos numérico que representa una etiqueta o nivel. Vg. 1 para masculino, 2 para femenino. Estos datos facilitan el ahorro de memoria del procesador.
Los datos NA y null son datos específicamente estadísticos. NA equivale a los datos perdidos y null representa la ausencia de datos. Ambos cobran sentido cuando trabajamos con tablas de datos complejas y permiten la identificación de esos tipos de "datos" y su tratamiento estadístico.
Los datos lógicos (TRUE/FALSE) permiten verificar si se cumple o no una condición determinada, facilitando el trabajo con al álgebra booleana.
Para conocer qué tipo de dato está asociado a una variable se usa la función class() (class(3)) que devuelve un string con el nombre del tipo de datos. También disponemos de la función is.TipoDato() (is.numeric(5)) que nos devuelve TRUE/FALSE.
En R se denomina coerción a la transformación de un tipo de dato en otro, y se realiza de forma implícita, del tipo de dato más restrictivo al nivel más flexible (lógico->entero->numérico->carácter) y no en orden inverso.
Para forzar explícitamente una determinada transformación empleamos la función as.TipoDato()
- as.integer()
- as.numeric()
- as.character(
- as.factor()
- as.logical()
- as.null()
- ...
Si la conversión (coerción) está permitida, nos devuelve el dato convertido, pero si no lo está nos devuelve un aviso de error y el valor NA.
lunes, 23 de diciembre de 2024
Lenguajes. R.
Conceptos básicos
El directorio o carpeta de trabajo es el espacio de memoria de nuestro ordenador en el que se encuentran los archivos con los que estamos trabajando y donde R los buscará para cargarlos y grabarlos.
domingo, 22 de diciembre de 2024
Lenguajes. R.
RStudio
sábado, 21 de diciembre de 2024
Lenguajes. R.
Primeros pasos en R
> print("Hola Mundo R")[1] "Hola Mundo R">
>saludo <- "Hola Mundo R" #Primera orden en R> print(saludo)[1] "Hola Mundo R">
... lo que estamos haciendo es repetir el procedimiento anterior, pero ahora empleando una variable (saludo) a la que asignamos (<-) un contenido textual, lo que hace que esa variable sea considerada de tipo Character (denominación más apropiada que String) (saludo <- "Hola Mundo R"). El texto que sigue, precedido de # es un comentario.
Para ver por pantalla la salida deberemos utilizar de nuevo la función print() (> print(saludo)), con la que obtenemos la misma salida o respuesta que antes ([1] "Hola Mundo R").
Cuando la consola contenga demasiadas líneas, podemos limpiarla mediante Editar | Limpiar consola.
Esta forma de trabajar con R (modo consola), aunque es perfectamente válida para las fases iniciales del aprendizaje, presenta evidentes limitaciones, por lo que es normalmente trabajaremos con el Editor R, que es una ventana emergente que se activa desde Archivo | Nuevo script y que nos permite crear script que podremos guardar para recuperar en otro momento mediante Archivo | Abrir script.
Para correr un script previamente guardado, deberemos situarnos en la línea que deseemos correr y ejecutar el comando Correr línea o seleccionar (tercer icono bajo las etiquetas de comandos). Si simplemente nos posicionamos en una línea, se reproducirá ésta en la consola y se ejecutará si tiene alguna instrucción o función ejecutable. Si seleccionamos un conjunto de líneas se reproducirán y ejecutará todas ellas automática y sucesivamente.
Una vez creado el script podremos guardarlo mediante el comando Guardar script (segundo icono) o mediante Archivo | Guardar / Guardar como (si queremos renombrarlo). Finalmente podremos cerrarlo mediante Archivo | Cerrar script.
viernes, 20 de diciembre de 2024
Lenguajes. R.
Presentación
Análisis. Datos.
Acceso a tabla: columnas y filas.
Sub AccesoColDim vN As Integer, i As IntegerDim vHoja As String, vCol As String, vTipoDat As StringDim mDatosCol() As VariantDim oHoja As Object, oCelda As ObjectvN = 9vHoja = "Datos"vCol = "E"ReDim mDatosCol(vN)vTipoDat = "N" 'Tipo de datos a capturar: T - Texto y N - NuméricooHoja = ThisComponent.getSheets().getByName(vHoja)For i = 0 To UBound(mDatosCol())oCelda = oHoja.getCellRangeByName(vCol & i+2)If vTipoDat = "N" ThenmDatosCol(i) = CInt(oCelda.getString)ElseIf vTipoDat = "T" ThenmDatosCol(i) = oCelda.getStringEnd IfNextEnd Sub
Tras la declaración de las variables, asignamos valores a las variables que nos van a permitir dimensionar la matriz de datos (ReDim mDatosCol(vN)) y acceder a la hoja (vHoja = "Datos") y a la columna (vCol = "E") donde se encuentran dichos datos. Después seleccionamos el tipo de datos al que se va a acceder (vTipoDat = "N") (3), a fin de facilitar el uso de procedimiento adecuado a ese tipo de datos, según veremos un poco más abajo.
Lo siguiente que hacemos es acceder a la hoja (oHoja = ThisComponent.getSheets().getByName(vHoja)) y después, mednte un bucle (For i = 0 To UBound(mDatosCol())), a cada una de las celdas de la columna seleccionada (oCelda = oHoja.getCellRangeByName(vCol & i+2)). Como la instrucción de acceso es diferente en función del tipo de datos (textos o números), empleamos un condicional para acceder a números (If vTipoDat = "N" Then) -> (mDatosCol(i) = CInt(oCelda.getString)) u otro para acceder a textos (ElseIf vTipoDat = "T" Then) -> (mDatosCol(i) = oCelda.getString).
Y ya estamos en disposición de trabajar con esta matriz de datos que consideramos valores de la variable (en este caso) Actividad Tipo 1 (AT1), sea esta lo que sea.
Si quisiéramos acceder a una segunda variable, deberíamos crear una segunda matriz de datos y proceder del mismo modo, lo que implica complicar el script. En caso de que este script resulte demasiado complejo y se reduzca la funcionalidad de uso, sería conveniente plantearse la creación de una función o una subrutina en la que concretar aquellos procedimientos que se repiten varias veces en dicho script (4).
El acceso a una determinada fila | registro de la tabla, en principio, no es muy diferentes al modo que utilizamos para grabar los datos en una determinada fila, según quedó explicado en entradas anteriores [por ejemplo en esta], y que empleamos para crear el docap de generación de la tabla de datos [ver aquí], pero presenta algunas diferencias debidas al cambio de tratamiento de los datos.
Sub AccesoFilDim oHojaBD As Object, oCeldaInicio As Object, oCeldaRegistro As ObjectDim vN As Integer, i As IntegerDim vHoja As StringDim a As Integer, b As Integer, c As Integer, vFil As IntegerDim mDatos() As StringvHoja = "Datos" ' Nombre de la hoja de datosoHojaBD = ThisComponent.getSheets().getByName(vHoja)vN = 7 'Nº de elementos de la fila (campos del registro)ReDim mDatos(vN)c = 100vFil = 5 'Id de la fila (registro) a seleccionarFor b = 0 To cIf b + 1 = vFil ThenFor i = 0 To UBound(mDatos())oCeldaRegistro = oHojaBD.getCellByPosition(i,vFil)mDatos(i) = oCeldaRegistro.getString()NextEnd IfNextEnd Sub