Vectorización de una matriz
- alumnos <- c(24,22,20,19,21,25)
- mataprob <- c(67,72,84,53,82,79)
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
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()
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.
> 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.
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 declarar las variables, asignamos valores a aquellas que nos permiten dimensionar la matriz de datos (ReDim mDatosCol(vN)) y acceder a la hoja (vHoja = "Datos") y a la columna (vCol = "E") donde se encuentran los 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 dato, según veremos después.
Lo que sigue es acceder a la hoja (oHoja = ThisComponent.getSheets().getByName(vHoja)) y después, mediante 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 una estructura condicional compleja para acceder a números (If vTipoDat = "N" Then) -> (mDatosCol(i) = CInt(oCelda.getString)) y para acceder a textos (ElseIf vTipoDat = "T" Then) -> (mDatosCol(i) = oCelda.getString).
Ahora 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 supone hacer más extenso el script, pero no necesariamente más complejo. Aun así, en caso de que el script resulte demasiado extenso y se haga difícil de manejar, podremos optar por crear una función o una subrutina con la que solventar los procedimientos que se repiten varias veces en el script (4).
El acceso a una determinada fila | registro de la tabla, en principio, no es muy diferente al modo que utilizamos para grabar los datos en una fila, según quedó explicado en entradas anteriores [por ejemplo en esta], y que empleamos para crear el docap de creació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