Programa
40 preguntas y respuestas de entrevistas sobre programación en R para todos los niveles
Prepararse bien para una entrevista sobre programación en R es un factor crucial para tener éxito en ella. Este éxito tiene dos caras: para quien busca empleo, significa un contrato en la empresa y, para la empresa, significa encontrar a la persona perfecta para el puesto de trabajo.
Para aumentar tus posibilidades de tener éxito en una entrevista sobre R, siempre es beneficioso saber de antemano qué preguntas te pueden hacer, o qué preguntas puedes hacer.
Este artículo analiza 40 preguntas y respuestas fundamentales de entrevistas sobre programación en R para todos los niveles, así como algunas preguntas de entrevistas generales. Para mayor comodidad, todas las preguntas técnicas se dividen en tres niveles: preguntas de nivel básico, intermedio y avanzado.
Como recursos adicionales para la preparación de tu entrevista sobre programación en R, ten en cuenta los siguientes recursos útiles:
- Práctica de preguntas de entrevistas sobre estadística en R
- Preparación de entrevistas sobre ciencia de datos
- 21 preguntas principales de entrevistas sobre ciencia de datos
Preguntas de entrevistas sobre programación en R generales
Al principio de una entrevista sobre R, se pueden hacer algunas preguntas generales no técnicas sobre experiencia general con R. Por ejemplo:
- ¿Cuánto tiempo llevas trabajando en R?
- ¿Qué tipo de tareas realizas en R?
- ¿Cómo calificarías tu nivel de competencia en R?
Si buscas trabajo, deberías pensar de antemano en estas preguntas y en otras similares y preparar tus respuestas. No te preocupes si aún no tienes experiencia laboral real en R: describir tus prácticas en programación en R o tus proyectos en R individuales o en grupo realizados durante tus estudios sirve perfectamente.
Además, si te están entrevistando para un puesto de nivel inicial, no se espera necesariamente de ti una amplia experiencia laboral en R (incluso puede que no se espere ninguna). Recuerda que, puesto que te han invitado a esta entrevista, la empresa ha encontrado atractivo tu currículum.
Preguntas de entrevistas sobre programación en R para principiantes
Empecemos con algunas de las preguntas técnicas básicas de entrevistas sobre R a las que podrías enfrentarte. Para ello, es necesario que domines los conceptos básicos y tengas cierta experiencia práctica en el uso de R.
1. ¿Qué es R y cuáles son sus principales características?
R es un lenguaje y un entorno de programación muy utilizado para resolver problemas de ciencia de datos y especialmente diseñado para la computación estadística y la visualización de datos. Sus principales características son:
- Código abierto
- Interpretado (es decir, admite tanto la programación funcional como la orientada a objetos)
- Altamente extensible gracias a su gran colección de paquetes de ciencia de datos
- Funcional y flexible (los usuarios pueden definir sus propias funciones, así como ajustar diversos parámetros de las funciones existentes)
- Compatible con muchos sistemas operativos
- Puede integrarse fácilmente con otros lenguajes y marcos de programación
- Permite una potente computación estadística
- Ofrece diversas herramientas de visualización de datos para crear gráficos con calidad de publicación
- Equipado con interfaz de línea de comandos
- Con el apoyo de una sólida comunidad en línea
2. ¿Cuáles son algunas desventajas de utilizar R?
- Sintaxis no intuitiva y, por tanto, una curva de aprendizaje pronunciada, especialmente para los principiantes en programación
- Relativamente lento
- Uso ineficiente de la memoria
- Documentación de los paquetes incoherente y a menudo difícil de leer
- Algunos paquetes son de baja calidad o están mal mantenidos
- Posibles problemas de seguridad debido a su naturaleza de código abierto
3. Enumera y define algunos tipos de datos básicos en R.
- Numérico: números decimales.
- Entero: números enteros.
- Carácter: una letra, un número o un símbolo, o cualquier combinación de ellos, entre comillas normales o simples.
- Factor: categorías de un conjunto predefinido de valores posibles, a menudo con un orden intrínseco.
- Lógico: los valores booleanos TRUE y FALSE, representados de forma subyacente como 1 y 0, respectivamente.
4. Enumera y define algunas estructuras de datos básicas en R.
- Vector: estructura de datos unidimensional utilizada para almacenar valores del mismo tipo de datos.
- Lista: estructura de datos multidimensional utilizada para almacenar valores de cualquier tipo de datos u otras estructuras de datos.
- Matriz: estructura de datos bidimensional utilizada para almacenar valores del mismo tipo de datos.
- Marco de datos: estructura de datos bidimensional utilizada para almacenar valores de cualquier tipo de datos, pero cada columna debe almacenar valores del mismo tipo de datos.
5. ¿Cómo se importan datos en R?
El R básico proporciona funciones esenciales para importar datos:
read.table()
, la función más general del R básico para importar datos, admite datos tabulares con cualquier tipo de separadores de campo, incluidos los específicos, como |.read.csv()
, archivos CSV (valores separados por comas) con.
como separador decimal.read.csv2()
, archivos de valores separados por punto y coma con,
como separador decimal.read.delim()
, archivos TSV (valores separados por tabuladores) con.
como separador decimal.read.delim2()
, archivos TSV (valores separados por tabuladores) con,
como separador decimal.
En la práctica, cualquiera de estas funciones puede utilizarse para importar datos tabulares con cualquier tipo de campo y separadores decimales: utilizarlas para los formatos de archivos especificados es solo cuestión de convención y ajustes predeterminados. Por ejemplo, esta es la sintaxis de la primera función: read.table(file, header = FALSE, sep = "", dec = ".")
. Las demás funciones tienen los mismos parámetros con diferentes ajustes predeterminados, que siempre se pueden sobrescribir explícitamente.
Los paquetes tidyverse readr y readxl proporcionan otras funciones para importar formatos de archivo específicos. Cada una de esas funciones puede ajustarse aún más mediante la configuración de diferentes parámetros opcionales.
readr
read_tsv()
, archivos TSV (valores separados por tabuladores).read_fwf()
, archivos de ancho fijo.read_log()
, archivos de weblog.read_table()
,read_csv()
,read_csv2()
yread_delim()
, equivalentes a las funciones del R básico.
readxl
read_excel()
, archivos de Excel.read_csv()
, equivalente a la función de las funciones del R básico.
Para profundizar en la carga de datos en R, puedes consultar el tutorial Cómo importar datos en R.
6. ¿Qué es un paquete en R y cómo se instalan y cargan los paquetes?
Un paquete R es una colección de funciones, código, datos y documentación que representa una extensión del lenguaje de programación R y está diseñado para resolver tipos específicos de tareas. R viene con un montón de paquetes preinstalados, y los usuarios pueden instalar otros paquetes desde los repositorios. El repositorio centralizado más popular, que almacena miles de paquetes R diferentes, se llama Comprehensive R Archive Network (CRAN).
Para instalar un paquete R directamente desde CRAN, tenemos que pasar el nombre del paquete entre comillas a la función install.packages()
, como se indica a continuación: install.packages("package_name")
. Para instalar más de un paquete desde CRAN de una sola vez, tenemos que utilizar un vector de caracteres que contenga los nombres de los paquetes entre comillas, como se indica a continuación: install.packages(c("package_name_1", "package_name_2")
. Para instalar un paquete R manualmente, primero tenemos que descargar el paquete como archivo .zip en nuestro ordenador y, a continuación, ejecutar install.packages() function
:
install.packages("path_to_the_locally_stored_zipped_package_file", repos=NULL, type="source")
Para cargar un paquete R instalado en el entorno R de trabajo, podemos utilizar las funciones library()
o require()
. Ambas reciben el nombre del paquete sin comillas y cargan el paquete; por ejemplo, library(caret)
. Sin embargo, el comportamiento de estas funciones es diferente cuando no encuentran el paquete necesario: library()
lanza un error y detiene la ejecución del programa, mientras que require()
emite una advertencia y continúa la ejecución del programa.
7. ¿Cómo se crea un marco de datos en R?
1. A partir de uno o más vectores de la misma longitud, utilizando la función data.frame()
:
df <- data.frame(vector_1, vector_2)
2. A partir de una matriz, utilizando la función data.frame()
:
df <- data.frame(my_matrix)
3. A partir de una lista de vectores de la misma longitud, utilizando la función data.frame()
:
df <- data.frame(list_of_vectors)
4. Desde otros marcos de datos:
- Para combinar los marcos de datos horizontalmente (solo si los marcos de datos tienen el mismo número de filas y los registros son iguales y están en el mismo orden), utilizando la función
cbind()
:
df <- cbind(df1, df2)
- Para combinar los marcos de datos verticalmente (solo si tienen el mismo número de columnas del mismo tipo de datos, con nombres idénticos y en el mismo orden), utilizando la función
rbind()
:
df <- rbind(df1, df2)
8. ¿Cómo se añade una nueva columna a un marco de datos en R?
- Utilizando el símbolo $:
df <- data.frame(col_1=10:13, col_2=c("a", "b", "c", "d"))
print(df)
df$col_3 <- c(5, 1, 18, 16)
print(df)
Salida:
col_1 col_2
1 10 a
2 11 b
3 12 c
4 13 d
col_1 col_2 col_3
1 10 a 5
2 11 b 1
3 12 c 18
4 13 d 16
- Utilizando corchetes:
df <- data.frame(col_1=10:13, col_2=c("a", "b", "c", "d"))
print(df)
df["col_3"] <- c(5, 1, 18, 16)
print(df)
Salida:
col_1 col_2
1 10 a
2 11 b
3 12 c
4 13 d
col_1 col_2 col_3
1 10 a 5
2 11 b 1
3 12 c 18
4 13 d 16
- Utilizando la función
cbind()
:
df <- data.frame(col_1=10:13, col_2=c("a", "b", "c", "d"))
print(df)
df <- cbind(df, col_3=c(5, 1, 18, 16))
print(df)
Salida:
col_1 col_2
1 10 a
2 11 b
3 12 c
4 13 d
col_1 col_2 col_3
1 10 a 5
2 11 b 1
3 12 c 18
4 13 d 16
En los tres casos, podemos asignar un valor único o un vector, o calcular la nueva columna basándonos en las columnas existentes de ese marco de datos o de otros marcos de datos.
9. ¿Cómo se eliminan columnas de un marco de datos en R?
1. Utilizando la función select()
del paquete dplyr de la colección tidyverse. El nombre de cada columna que se desea eliminar se pasa con un signo menos delante:
df <- select(df, -col_1, -col_3)
Si, en cambio, tenemos que eliminar demasiadas columnas, tiene más sentido conservar el resto de las columnas en lugar de eliminar las columnas que nos interesan. En este caso, la sintaxis es similar, pero los nombres de las columnas que hay que conservar no van precedidos del signo menos:
df <- select(df, col_2, col_4)
2. Utilizando la función integrada subset() del R básico. Si tenemos que borrar solo una columna, asignamos al parámetro select de la función el nombre de la columna precedido de un signo menos. Para eliminar más de una columna, asignamos a este parámetro un vector que contenga los nombres de columna necesarios precedidos de un signo menos:
df <- subset(df, select=-col_1)
df <- subset(df, select=-c(col_1, col_3))
Si, en cambio, tenemos que eliminar demasiadas columnas, tiene más sentido conservar el resto de las columnas en lugar de eliminar las columnas que nos interesan. En este caso, la sintaxis es similar, pero no se añade el signo menos:
df <- subset(df, select=col_2)
df <- subset(df, select=c(col_2, col_4))
10. ¿Qué es un factor en R?
Un factor en R es un tipo de datos específico que acepta categorías (también llamadas niveles) de un conjunto predefinido de valores posibles. Estas categorías parecen caracteres, pero en realidad se almacenan como números enteros. A menudo, estas categorías tienen un orden intrínseco. Por ejemplo, una columna de un marco de datos que contenga las opciones de la escala Likert de opiniones ("strongly agree", "agree", "somewhat agree", "neither agree nor disagree", "somewhat disagree", "disagree", "strongly disagree") debe ser de tipo factorial para captar este orden intrínseco y reflejarlo adecuadamente en los tipos de gráficos de categorías.
11. ¿Qué es RStudio?
RStudio es un entorno de desarrollo integrado (IDE) de código abierto muy utilizado como front-end gráfico para trabajar con el lenguaje de programación R a partir de la versión 3.0.1. Tiene muchas características útiles que lo hacen muy popular entre los usuarios de R:
- Fácil de usar
- Flexible
- Multifunctional
- Permite crear scripts reutilizables
- Rastrea el historial de operaciones
- Autocompleta el código
- Ofrece ayuda detallada y completa sobre cualquier objeto
- Facilita el acceso a todos los datos importados y objetos construidos
- Facilita el cambio entre terminal y consola
- Permite previsualizar el gráfico
- Ayuda a crear y compartir proyectos de forma eficiente
- Se puede utilizar con otros lenguajes de programación (Python, SQL, etc.)
Para saber más sobre qué es RStudio y cómo instalarlo y empezar a utilizarlo, puedes seguir el Tutorial de RStudio.
12. ¿Qué es R Markdown?
R Markdown es un paquete R gratuito y de código abierto que proporciona un marco de autoría para construir proyectos de ciencia de datos. Con él, podemos escribir un archivo .rmd único que combine narración, código y gráficos de datos y, a continuación, renderizar este archivo en un formato de salida seleccionado. Las principales características de R Markdown son:
- Los documentos resultantes se pueden compartir, son totalmente reproducibles y tienen calidad de publicación.
- Una amplia gama de salidas y formatos estáticos y dinámicos, como HTML, PDF, Microsoft Word, documentos interactivos, paneles, informes, artículos, libros, presentaciones, aplicaciones, sitios web, plantillas reutilizables, etc.
- Fácil seguimiento del control de versiones.
- Se admiten varios lenguajes de programación, como R, Python y SQL.
13. ¿Cómo se crea una función definida por el usuario en R?
Para crear una función definida por el usuario en R, utilizamos la palabra clave function
y la siguiente sintaxis:
function_name <- function(parameters){
function body
}
- Nombre de la función: nombre del objeto función que se utilizará para llamar a la función tras su definición.
- Parámetros de la función: variables separadas por una coma y colocadas entre paréntesis que se establecerán como valores reales de los argumentos cada vez que llamemos a la función.
- Cuerpo de la función: fragmento de código entre llaves que contiene las operaciones que deben realizarse en un orden predefinido sobre los argumentos de entrada cada vez que llamemos a la función. Normalmente, el cuerpo de la función contiene las sentencias
return()
que devuelven la salida de la función o las sentenciasprint()
para imprimir la salida.
Un ejemplo de función definida por el usuario sencilla en R:
my_function <- function(x, y){
return(x + y)
}
14. Enumera algunos paquetes populares de visualización de datos en R.
- ggplot2: el paquete de visualización de datos más popular de R, que permite crear una gran variedad de gráficos.
- Lattice: para mostrar datos multivariantes como un panel en mosaico (trellis) de varios gráficos.
- Plotly: para crear gráficos interactivos con calidad de publicación.
- highcharter: para trazar gráficos dinámicos fácilmente; ofrece muchas características flexibles, complementos y temas y permite trazar gráficos de diferentes objetos R con una función.
- Leaflet: para crear mapas interactivos.
- ggvis: para crear gráficos interactivos y altamente personalizables a los que se puede acceder en cualquier navegador utilizando la infraestructura de Shiny.
- patchwork: para combinar varias tramas, normalmente de diferentes tipos, en el mismo gráfico.
Preguntas de entrevistas sobre programación en R intermedias
A profesionales con más experiencia, es probable que se les formulen algunas preguntas que requieran un conocimiento más detallado de R. He aquí algunas para las que hay que prepararse:
15. ¿Cómo se asigna un valor a una variable en R?
- Utilizar el operador de asignación
<-
, por ejemplo,my_var <- 1—
, es la forma más habitual de asignar un valor a una variable en R. - Utilizar el operador de igualdad
=
, por ejemplo,my_var = 1
: para asignar valores a argumentos dentro de la definición de una función. - Utilizar el operador de asignación hacia la derecha
->
, por ejemplo,my_var -> 1
: puede utilizarse en pipes. - Utilizar los operadores de asignación globales, hacia la izquierda (
<<-
) o hacia la derecha (->>
), por ejemplo,my_var <<- 1
: para crear una variable global dentro de la definición de una función.
16. ¿Cuáles son los requisitos para poner nombre a variables en R?
- Un nombre de variable puede ser una combinación de letras, cifras, puntos y guiones bajos. No puede contener ningún otro símbolo, incluidos los espacios en blanco.
- Un nombre de variable debe empezar por una letra o un punto.
- Si un nombre de variable empieza por un punto, este punto no puede ir seguido de una cifra.
- Las palabras reservadas en R (
TRUE
,for
,NULL
, etc.) no pueden utilizarse como nombres de variables. - Los nombres de variables distinguen entre mayúsculas y minúsculas.
En el curso Escribir código R eficiente encontrarás más prácticas recomendadas para escribir código en R.
17. ¿Qué tipos de bucles existen en R y cuál es la sintaxis de cada tipo?
1. Bucle for: itera sobre una secuencia un número de veces igual a su longitud (a menos que se utilicen las sentencias break
o next
) y realiza el mismo conjunto de operaciones en cada elemento de esa secuencia. Este es el tipo más común de bucles. La sintaxis de un bucle for en R es la siguiente:
for (variable in sequence) {
operations
}
2. Bucle while: realiza el mismo conjunto de operaciones hasta que se cumplan las condiciones lógicas predefinidas, a menos que se utilicen las sentencias break
o next
. A diferencia de los bucles for, no sabemos de antemano el número de iteraciones que va a ejecutar un bucle while. Antes de ejecutar un bucle while, tenemos que asignar variables y, a continuación, actualizar su valor dentro del cuerpo del bucle en cada iteración. La sintaxis de un bucle while en R es la siguiente:
variable assignment
while (logical condition) {
operations
variable update
}
3. Bucle repeat: realiza repetidamente el mismo conjunto de operaciones hasta que se cumplan las condiciones de interrupción predefinidas. Para introducir estas condiciones, un bucle repeat tiene que contener un bloque de código de sentencias if que, a su vez, tiene que incluir la sentencia break
en su cuerpo. Igual que en los bucles while, no sabemos de antemano el número de iteraciones que va a ejecutar un bucle repeat. La sintaxis de un bucle repeat en R es la siguiente:
repeat {
operations
if(break condition) {
break
}
}
Puedes leer más sobre bucles en R en nuestro tutorial independiente.
18. ¿Cómo se agregan datos en R?
Para agregar datos en R, utilizamos la función aggregate()
. Esta función tiene los siguientes parámetros esenciales, en este orden:
x
, el marco de datos que se va a agregar.by
, una lista de los factores por los que se va a realizar la agrupación.FUN
, una función de agregación para computar las estadísticas resumidas de cada grupo (por ejemplo,mean
,max
,min
,count
,sum
).
19. ¿Cómo se fusionan datos en R?
1. Utilizando la función cbind()
, solo si los marcos de datos tienen el mismo número de filas y los registros son iguales y están en el mismo orden:
df <- cbind(df1, df2)
2. Utilizando la función rbind()
para combinar los marcos de datos verticalmente, solo si tienen el mismo número de columnas del mismo tipo de datos, con nombres idénticos y en el mismo orden:
df <- rbind(df1, df2)
3. Utilizando la función merge()
para fusionar marcos de datos por una columna en común, normalmente una columna de ID:
- Inner join:
df <- merge(df1, df2, by="ID")
- Left join:
df <- merge(df1, df2, by="ID", all.x=TRUE)
- Right join:
df <- merge(df1, df2, by="ID", all.y=TRUE)
- Outer join:
df <- merge(df1, df2, by="ID", all=TRUE)
4. Utilizando la función join()
del paquete dplyr para fusionar marcos de datos por una columna en común, normalmente una columna de ID:
df <- join(df1, df2, by="ID", type="type_of_join")
El parámetro type
toma uno de los siguientes valores: "inner", "left", "right" o "full".
20. ¿Cómo se concatenan cadenas en R?
Podemos concatenar dos o más cadenas en R utilizando las funciones paste()
o cat()
. El primer enfoque es más popular. Ambas funciones aceptan cualquier número de cadenas para concatenar y también pueden aceptar un parámetro opcional sep
(junto con otros parámetros opcionales), un carácter o una secuencia de caracteres que separarán las cadenas juntas en la cadena resultante (un espacio en blanco de forma predeterminada).
21. ¿Cómo se transponen datos bidimensionales en R?
Podemos transponer un marco de datos o una matriz en R para que las columnas se conviertan en filas, y viceversa. Para ello, debemos utilizar la función t()
del R básico. Por ejemplo:
df <- data.frame(col_1=c(10, 20, 30), col_2=c(11, 22, 33))
print(df)
transposed_df <- t(df)
print(transposed_df)
Salida:
col_1 col_2
1 10 11
2 20 22
3 30 33
[,1] [,2] [,3]
col_1 10 20 30
col_2 11 22 33
22. ¿Cómo se encadenan varias operaciones en R?
Podemos encadenar varias operaciones en R utilizando el operador pipe (%>%
) que proporciona la colección tidyverse. El uso de este operador permite crear un pipeline de funciones en el que la salida de la primera función se pasa como entrada a la segunda función y así sucesivamente, hasta que termina el pipeline. Esto elimina la necesidad de crear variables adicionales y mejora significativamente la legibilidad general del código.
Ejemplo de utilización del operador pipe en un marco de datos:
df <- data.frame(a=1:4, b=11:14, c=21:24)
print(df)
df_new <- df %>% select(a, b) %>% filter(a > 2)
print(df_new)
Salida:
a b c
1 1 11 21
2 2 12 22
3 3 13 23
4 4 14 24
a b
1 3 12
2 4 13
23. ¿Qué tipos de gráficos de datos se pueden crear en R?
La visualización de datos es uno de los puntos fuertes de los lenguajes de programación R. Podemos crear todo tipo de gráficos de datos en R:
- Tipos habituales de gráficos de datos:
- Gráfico de barras: muestra los valores numéricos de los datos de categorías.
- Gráfico de líneas: muestra la progresión de una variable, normalmente a lo largo del tiempo.
- Gráfico de dispersión: muestra las relaciones entre dos variables.
- Gráfico de área: basado en un gráfico de líneas, con el área por debajo de la línea coloreada o rellena con un patrón.
- Gráfico circular: muestra la proporción de cada categoría de datos de categorías como parte del todo.
- Gráfico de cajas: muestra un conjunto de estadísticas descriptivas de los datos.
- Tipos avanzados de gráficos de datos:
- Gráfico de violín: muestra tanto un conjunto de estadísticas descriptivas de los datos como la forma de distribución de esos datos.
- Mapa de calor: muestra la magnitud de cada punto de datos numérico del conjunto de datos.
- Mapa de árbol: muestra los valores numéricos de los datos de categorías, a menudo como una parte del todo.
- Dendrograma: muestra una jerarquía interna y la agrupación de los datos.
- Gráfico de burbujas: muestra las relaciones entre tres variables.
- Gráfico hexbin: muestra las relaciones de dos variables numéricas en un conjunto de datos relativamente grande.
- Nube de palabras: muestra la frecuencia de palabras en un texto de entrada.
- Mapa coroplético: muestra estadísticas temáticas agregadas de geodatos.
- Gráfico de empaquetamiento de círculos: muestra una jerarquía interna de los datos y los valores de los puntos de datos.
- Y otros.
El programa Visualización de datos con R te ayudará a ampliar tus horizontes en el campo de los gráficos R. Si prefieres aprender la visualización de datos en R en un contexto más amplio, explora un programa de carrera completo y apto para principiantes, Ciencia de datos con R.
24. ¿Qué es el reciclaje de vectores en R?
Si intentamos realizar alguna operación en dos vectores R con longitudes diferentes, el intérprete R detecta el más corto y recicla sus elementos en el mismo orden hasta que las longitudes de los dos vectores coinciden. Solo entonces realiza la operación necesaria en estos vectores. Sin embargo, antes de iniciar el reciclaje de vectores, el intérprete R lanza un mensaje de advertencia sobre el desajuste inicial de las longitudes de los vectores.
Por ejemplo, si intentamos ejecutar la siguiente adición:
c(1, 2, 3, 4, 5) + c(1, 2, 3)
El segundo vector, debido al reciclaje de vectores, se convertirá en c(1, 2, 3, 1, 2)
. Por tanto, el resultado final de esta operación será c(2, 4, 6, 5, 7)
.
Aunque a veces el reciclaje de vectores puede ser beneficioso (por ejemplo, cuando esperamos que los valores de los vectores sean cíclicos), lo más frecuente es que resulte inadecuado y engañoso. Por tanto, debemos tener cuidado y fijarnos en las longitudes de los vectores antes de realizar operaciones con ellos.
25. ¿Para qué sirven las sentencias next
y break
en R?
La sentencia next
se utiliza para omitir una iteración concreta y salta a la siguiente si se cumple una determinada condición. La sentencia break
se utiliza para detener el bucle y salir de él en una iteración concreta si se cumple una determinada condición. Cuando se utiliza en uno de los bucles internos de un bucle anidado, esta sentencia solo provoca la salida de ese bucle interno.
Las sentencias next
y break
pueden utilizarse en cualquier tipo de bucles en R: bucles for, bucles while y bucles repeat. También se pueden utilizar en el mismo bucle, por ejemplo:
for(i in 1:10) {
if(i < 5)
next
if(i == 8)
break
print(i)}
Salida:
[1] 5
[1] 6
[1] 7
26. ¿Cuál es la diferencia entre las funciones str()
y summary()
en R?
La función str()
devuelve la estructura de un objeto R y la información general sobre él, cuyo contenido exacto depende de la estructura de datos de ese objeto. Por ejemplo, para un vector, devuelve el tipo de datos de sus elementos, el intervalo de los índices de los elementos y los valores de los elementos (o varios primeros valores, si el vector es demasiado largo). Para un marco de datos, devuelve su clase (data.frame), el número de observaciones y variables, los nombres de las columnas, el tipo de datos de cada columna y varios primeros valores de cada columna.
La función summary()
devuelve las estadísticas resumidas de un objeto R. Se aplica sobre todo a marcos de datos y matrices, para los que devuelve los valores mínimo, máximo, medio y mediano, y los cuartiles 1 y 3 de cada columna numérica; para las columnas de factor, devuelve el recuento de cada nivel.
27. ¿Cuál es la diferencia entre las funciones subset()
y sample()
en R?
La función subset()
en R se utiliza para extraer filas y columnas de un marco de datos o una matriz, o elementos de un vector, a partir de determinadas condiciones, por ejemplo: subset(my_vector, my_vector > 10)
.
En cambio, la función sample()
en R solo puede aplicarse a vectores. Extrae una muestra aleatoria del tamaño predefinido de los elementos de un vector, con o sin sustitución. Por ejemplo, sample(my_vector, size=5, replace=TRUE)
Preguntas de entrevistas sobre programación en R avanzadas
28. ¿Cómo se crea una nueva columna en un marco de datos en R a partir de otras columnas?
1. Utilizando las funciones transform()
y ifelse()
del R básico:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Adding the column col_3 to the data frame df
df <- transform(df, col_3 = ifelse(col_1 < col_2, col_1 + col_2, col_1 * col_2))
print(df)
Salida:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
2. Utilizando las funciones with()
y ifelse()
del R básico:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Adding the column col_3 to the data frame df
df["col_3"] <- with(df, ifelse(col_1 < col_2, col_1 + col_2, col_1 * col_2))
print(df)
Salida:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
3. Utilizando la función apply()
del R básico:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Adding the column col_3 to the data frame df
df["col_3"] <- apply(df, 1, FUN = function(x) if(x[1] < x[2]) x[1] + x[2] else x[1] * x[2])
print(df)
Salida:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
4. Utilizando la función mutate()
del paquete dplyr y la función ifelse()
del R básico:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Adding the column col_3 to the data frame df
df <- mutate(df, col_3 = ifelse(col_1 < col_2, col_1 + col_2, col_1 * col_2))
print(df)
Salida:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
29. ¿Cómo se analiza una fecha a partir de su representación de cadena en R?
Para analizar una fecha a partir de su representación de cadena en R, debemos utilizar el paquete lubridate de la colección tidyverse. Este paquete ofrece diferentes funciones para analizar una cadena y extraer de ella la fecha estándar a partir del patrón de fecha inicial de esa cadena. Estas funciones son ymd()
, ymd_hm()
, ymd_hms()
, dmy()
, dmy_hm()
, dmy_hms()
, mdy()
, mdy_hm()
, mdy_hms()
, etc., donde y, m, d, h, m y s corresponden a año, mes, día, horas, minutos y segundos, respectivamente.
Por ejemplo, si ejecutamos la función dmy()
pasándole las cadenas "05-11-2023", "05/11/2023" o "05.11.2023", que representan la misma fecha, recibiremos el mismo resultado: 2023-11-05
. Esto se debe a que, en los tres casos, a pesar de tener símbolos divisores diferentes, en realidad tenemos el mismo patrón: primero el día, después el mes y, por último, el año.
30. ¿Para qué se usa la función switch()
en R?
La función switch()
en R es una sentencia de control de estructura selectiva múltiple que evalúa una expresión comparándola con los elementos de una lista. Tiene la siguiente sintaxis:
switch(expression, case_1, case_2, case_3....)
La expresión pasada a la función switch()
puede equivaler a un número o a una cadena de caracteres y, dependiendo de esto, el comportamiento de la función es diferente.
1. Si la expresión equivale a un número, la función switch()
devuelve el elemento de la lista usando coincidencia posicional (es decir, su índice es igual al número al que equivale la expresión). Si el número es mayor que el número de elementos de la lista, la función switch()
devuelve NULL
. Por ejemplo:
switch(2, "circle", "triangle", "square")
Salida:
"triangle"
2. Si la expresión equivale a una cadena de caracteres, la función switch()
devuelve el valor usando su nombre:
switch("red", "green"="apple", "orange"="carot", "red"="tomato", "yellow"="lemon")
Salida:
"tomato"
Si hay varias coincidencias, se devuelve el primer valor coincidente. También es posible añadir un elemento sin nombre como último argumento de la función switch()
, que será una opción alternativa predeterminada en caso de que no haya coincidencias. Si no se establece esta opción predeterminada y no hay coincidencias, la función devuelve NULL
.
La función switch()
es una alternativa eficiente a las largas sentencias if-else, ya que hace que el código sea menos repetitivo y más legible. Normalmente, se utiliza para evaluar una expresión única. Podemos escribir constructos de interruptor anidados más complejos para evaluar varias expresiones. Sin embargo, de esta forma, la función switch()
se vuelve rápidamente difícil de leer y, por tanto, pierde su principal ventaja sobre los constructos if-else.
31. ¿Cuál es la diferencia entre las funciones apply()
, lapply()
, sapply()
y tapply()
?
Aunque todas estas funciones permiten iterar sobre una estructura de datos sin utilizar bucles y realizan la misma operación sobre cada elemento de ella, son diferentes en cuanto al tipo de entrada y salida y a la función que realizan.
apply()
toma un marco de datos, una matriz o un array y devuelve un vector, una lista, una matriz o un array. Esta función puede aplicarse por filas, por columnas o de ambas formas.lapply()
toma un vector, una lista o un marco de datos y siempre devuelve una lista. Si tenemos un marco de datos como entrada, esta función se aplica solo por columnas.sapply()
toma un vector, una lista o un marco de datos y devuelve la estructura de datos más simplificada, es decir, un vector para un vector de entrada, una lista para una lista de entrada y una matriz para un marco de datos de entrada.tapply()
calcula estadísticas resumidas para distintos factores (es decir, datos de categorías).
32. Enumera y define las sentencias de control en R.
Hay tres grupos de sentencias de control en R: sentencias condicionales, sentencias de bucle y sentencias de salto.
Sentencias condicionales:
if
prueba si se cumple una condición dada y proporciona operaciones que se pueden realizar si es así.if-else
prueba si se cumple una condición dada, proporciona operaciones que se pueden realizar si es así y proporciona otro conjunto de operaciones que se pueden realizar en caso contrario.if... else if... else
prueba una serie de condiciones una a una, proporciona operaciones que se pueden realizar para cada condición si se cumple y proporciona un conjunto alternativo de operaciones que se pueden realizar si no se cumple ninguna de esas condiciones.switch
evalúa una expresión comparándola con los elementos de una lista y devuelve un valor de la lista en función de los resultados de esta evaluación.
Sentencias de bucle:
for
, en bucles for, itera sobre una secuencia.while
, en bucles while, comprueba si se cumplen las condiciones lógicas predefinidas en la iteración actual.repeat
, en bucles repeat, sigue realizando el mismo conjunto de operaciones hasta que se cumplan las condiciones de interrupción predefinidas.
Sentencias de salto:
next
omite una iteración concreta de un bucle y salta a la siguiente si se cumple una determinada condición.break
detiene el bucle y sale de él en una iteración concreta si se cumple una determinada condición.return
sale de una función y devuelve el resultado.
33. ¿Qué son las expresiones regulares y cómo se trabaja con ellas en R?
Una expresión regular o regex en R u otros lenguajes de programación es un carácter o una secuencia de caracteres que describe un determinado patrón de texto y se utiliza para la minería de datos de texto. En R hay dos formas principales de trabajar con expresiones regulares:
- Utilizar el R básico y sus funciones (como
grep()
,regexpr()
,gsub()
,regmatches()
, etc.) para localizar, comparar, extraer y sustituir regex. - Utilizar un paquete stringr especializado de la colección tidyverse. Esta es una forma más cómoda de trabajar con regex R, ya que las funciones de stringr tienen nombres y sintaxis mucho más intuitivos y ofrecen una funcionalidad más amplia.
Guía de expresiones regulares R proporciona más detalles sobre cómo trabajar con regex en R.
34. ¿Qué paquetes se utilizan para el machine learning en R?
- caret: para diferentes algoritmos de clasificación y regresión.
- e1071: para máquinas de vectores de soporte (SVM), clasificador bayesiano ingenuo, bagged clustering, fuzzy clustering y k vecinos más próximos (KNN).
- kernlab: proporciona métodos kernel para algoritmos de clasificación, regresión y agrupamiento.
- randomForest: para algoritmos de clasificación y regresión random forest.
- xgboost: para algoritmos de potenciación del gradiente, regresión lineal y árbol de decisión.
- rpart: para el particionamiento recursivo en árboles de clasificación, regresión y supervivencia.
- glmnet: para métodos de regularización LASSO y Elastic Net aplicados a algoritmos de regresión lineal, regresión logística y regresión multinomial.
- nnet: para redes neuronales y algoritmos log-lineales multinomiales.
- tensorflow: la interfaz R para TensorFlow, para redes neuronales profundas y computación numérica mediante gráficos de flujo de datos.
- Keras: la interfaz R para Keras, para redes neuronales profundas.
35. ¿Cómo se seleccionan características para el machine learning en R?
Consideremos tres enfoques diferentes y cómo implementarlos en el paquete caret.
- Detectando características altamente correlacionadas en el conjunto de datos y eliminándolas.
Tenemos que crear una matriz de correlaciones de todas las características y, a continuación, identificar las altamente correlacionadas, que suelen ser las que tienen un coeficiente de correlación superior a 0,75:
corr_matrix <- cor(features)
highly_correlated <- findCorrelation(corr_matrix, cutoff=0.75)
print(highly_correlated)
- Clasificando las características del marco de datos según su importancia.
Tenemos que crear un esquema de entrenamiento para controlar los parámetros del entrenamiento, utilizarlo para construir un modelo seleccionado y, a continuación, estimar la importancia de la variable para ese modelo:
control <- trainControl(method="repeatedcv", number=10, repeats=5)
model <- train(response_variable~., data=df, method="lvq", preProcess="scale", trControl=control)
importance <- varImp(model)
print(importance)
- Seleccionando automáticamente las características óptimas.
Uno de los métodos más populares que proporciona caret para seleccionar automáticamente las características óptimas es un algoritmo de selección hacia atrás llamado Recursive Feature Elimination (RFE).
Tenemos que computar el control utilizando un método de remuestreo seleccionado y una lista predefinida de funciones y aplicar el algoritmo RFE pasándole las características, la variable objetivo, el número de características que se deben retener y el control. A continuación, extraemos los predictores seleccionados:
control <- rfeControl(functions=caretFuncs, method="cv", number=10)
results <- rfe(features, target_variable, sizes=c(1:8), rfeControl=control)
print(predictors(results))
Si necesitas reforzar tus conocimientos de machine learning en R, aquí tienes un recurso sólido y completo: Ciencia de machine learning con R.
36. ¿Qué son la correlación y la covarianza, y cómo se calculan en R?
La correlación es una medida de la fuerza y la dirección de las relaciones lineales entre dos variables. Toma valores de -1 (una correlación negativa perfecta) a 1 (una correlación positiva perfecta). La covarianza es una medida del grado en que dos variables cambian una con relación a otra y de la dirección de las relaciones lineales entre ellas. A diferencia de la correlación, la covarianza no tiene límite de intervalo.
En R, para calcular la correlación, tenemos que utilizar la función cor()
; para calcular la covarianza, la función cov()
. La sintaxis de ambas funciones es idéntica: debemos pasar dos variables (vectores) para las que queremos calcular la medida (por ejemplo, cor(vector_1, vector_2)
o cov(vector_1, vector_2)
) o todo el marco de datos, si queremos calcular la correlación o la covarianza entre todas las variables de ese marco de datos (por ejemplo, cor(df) or cov(df)
). Si pasamos dos vectores, el resultado será un valor único; si pasamos un marco de datos, el resultado será una matriz de correlación (o covarianza).
37. Enumera y define los distintos enfoques para estimar la exactitud de los modelos en R.
A continuación se presentan varios enfoques y cómo implementarlos en el paquete caret de R.
- División de datos: todo el conjunto de datos se divide en un conjunto de datos de entrenamiento y conjunto de datos de prueba. El primero se utiliza para ajustar el modelo; el segundo, para probar su rendimiento en datos no vistos. Este enfoque funciona especialmente bien con big data. Para implementar la división de datos en R, tenemos que utilizar la función
createDataPartition()
y ajustar el parámetro p a la proporción necesaria de datos que se destinan al entrenamiento. - Remuestreo bootstrap: extraer muestras aleatorias de datos del conjunto de datos y estimar el modelo con ellas. Estas iteraciones de remuestreo se ejecutan muchas veces y con sustitución. Para aplicar el remuestreo bootstrap en R, tenemos que establecer el parámetro
method
de la funcióntrainControl()
en"boot"
al definir el control de entrenamiento del modelo. - Métodos de validación cruzada
- k-fold cross-validation: el conjunto de datos se divide en k subconjuntos. El modelo se entrena con k-1 subconjuntos y se prueba en el restante. Se repite el mismo proceso para todos los subconjuntos y, a continuación, se estima la exactitud final del modelo.
- Repeated k-fold cross-validation: el principio es el mismo que para k-fold cross-validation, pero el conjunto de datos se divide en k subconjuntos más de una vez. Para cada repetición, se estima la exactitud del modelo y, a continuación, se calcula la exactitud final del modelo como la media de los valores de exactitud del modelo de todas las repeticiones.
- Leave-one-out cross-validation (LOOCV): se aparta una observación de datos y el modelo se entrena con todas las demás observaciones de datos. Se repite el mismo proceso para todas las observaciones de datos.
Para implementar estos métodos de validación cruzada en R, debemos establecer el parámetro method
de la función trainControl()
en "cv"
, "repeatedcv"
o "LOOCV"
, respectivamente, al definir el control de entrenamiento del modelo.
38. ¿Qué es la prueba χ² y cómo se realiza en R?
El contraste de hipótesis χ² es una técnica utilizada para determinar si dos variables de categorías son independientes o si existe una correlación entre ellas. Para realizar la prueba χ² en R, tenemos que utilizar la función chisq.test()
del paquete stats. Los pasos son los siguientes:
1. Crea una tabla de contingencia con las variables de categorías de interés utilizando la función table()
del R básico:
table = table(df["var_1"], df["var_2"])
2. Pasa la tabla de contingencia a la función chisq.test()
:
chisq.test(table)
Refresca tus conocimientos sobre las pruebas χ² y otros contrastes de hipótesis en nuestro curso Contrastes de hipótesis en R.
39. ¿Qué es Shiny en R?
Shiny es un paquete R de código abierto que permite construir fácil y rápidamente aplicaciones web y páginas web totalmente interactivas para la ciencia de datos utilizando solo R, sin ningún conocimiento de HTML, CSS o JavaScript. Shiny en R ofrece numerosas características básicas y avanzadas, widgets, diseños, ejemplos de aplicaciones web y su código subyacente para construir sobre ellos y personalizarlos, así como ejemplos de usuarios de diversos campos (tecnología, deportes, banca, educación, etc.) reunidos y categorizados por la comunidad de desarrolladores de aplicaciones Shiny.
40. ¿Cuál es la diferencia entre las funciones with()
y within()
?
La función with()
evalúa una expresión R en una o más variables de un marco de datos y emite el resultado sin modificar el marco de datos. La función within()
evalúa una expresión R en una o más variables de un marco de datos, modifica el marco de datos y emite el resultado. A continuación podemos ver cómo trabajan estas funciones utilizando como ejemplo un marco de datos de muestra:
df <- data.frame(a = c(1, 2, 3), b = c(10, 20, 30))
print(df)
with(df, a * b)
print(within(df, c <- a * b))
Salida:
a b
1 1 10
2 2 20
3 3 30
10 40 90
a b c
1 1 10 10
2 2 20 40
3 3 30 90
Al utilizar la función within()
, para guardar las modificaciones, debemos asignar la salida de la función a una variable.
Conclusión
En este artículo hemos considerado las 40 preguntas más comunes de entrevistas sobre programación en R y qué respuestas se esperan para cada una de ellas. Esperemos que, con esta información, sientas más seguridad para triunfar en tu entrevista sobre R, tanto si buscas un trabajo en R como si buscas a la persona adecuada para una vacante en tu empresa.
Para adquirir experiencia práctica respondiendo preguntas, consulta nuestro curso Práctica de preguntas de entrevistas sobre estadística en R.
¡Comienza hoy tu viaje por R!
Programa
Associate Data Scientist
Curso
Introduction to R
blog
28 preguntas principales de la entrevista a un científico de datos para todos los niveles
blog
30 preguntas de entrevista sobre Azure: De Básico a Avanzado

Josep Ferrer
15 min
blog
Las 23 mejores preguntas y respuestas de entrevistas sobre Python
Tutorial
Paquetes R: Tutorial para principiantes

DataCamp Team
15 min