En este notebook

Este notebook consiste de algunos ejercicios sencillos de para familiarizarse con las herramientas básicas de R.

Ejercicios

Raíces de un polinomio

Escriba un trozo ( chunk ) de código en el que defina los coeficientes de un polinómio de la pinta \(y = a_0 + a_1 x + a_2 x^2\) y calcule las raíces del polinomio \(x_{\pm} = \frac{-a_1 \pm \Delta}{2a_2}\), con \(\Delta = \sqrt{a_1^2-4a_2a_0}\)·

a_0 = -1
a_1 = 0
a_2 = 1

delta = ...

x_mas = (-a_1 + delta)/(2*a_2)
x_menos = ...

Raíces de un polinomio (v2)

Construya una función que reciba los coeficientes de un polinomio y retorne las posiciones de sus raíces.

calcula_raices = function(a_0,a_1,a_2){
  # Acá incluyan lo que armaron en el ejercicio anterior
  return(c(x_mas,x_menos))
}

Suma de números enteros

Construya una función que retorne la suma de los primeros N números enteros

suma_enteros = function(N){
  return(sum(...))
}

Escribiendo letras

Usando la función sample pueden elegirse un elemento al azar de un vector:

sample(1:3,size=1)

Imaginemos un teclado en el que se apretan letras al azar hasta que sale una letra a. ¿Cuantas letras se escribiran en general? Para responder esto:

  • Construya una función que elija una letra al azar del abecedario:
elige_letra = function(){
  a = sample(...,size=1)
  return(...)
}
  • Construya una función que agregue letras a una palabra hasta que salga la primer letra a:
construye_palabra = function(letra_stop='a'){
  letra = elige_letra()
  palabra = letra
  while(...){
    letra = ...
    palabra = paste(palabra,...,sep='')
  }
  return(palabra)
}
  • Construya una función que se ocupe de generar N palabras y calcule la longitud promedio que tienen. La función nchar cuenta la cantidad de caracteres en un string. ¿Ve alguna relación entre el número de letras disponibles y la longitud de la palabra?
experimento_palabras = function(N=100,letra_stop='a'){
  longitud = 0
  for(i in 1:N){
    palabra = ...
    longitud = ... + nchar(palabra)
  }
  longitud = longitud/N
  return(longitud)
}
  • Basandose en la función anterior, construya otra función que le permita calcular el número promedio de letras d en las palabras generadas al azar.
cuantas_letra = function(palabra,letra_contar = 'b'){
  palabra_split = strsplit(palabra,'')[[1]] # Esto da un vector con las letras todas separadas
  conteo = sum(...==...) # Una forma de pensarlo
  return(conteo)
}

experimento_letras = function(N=100,letra_stop='a',letra_contar = 'b'){
  letras = 0
  for(i in 1:N){
    palabra = ...
    letras = ... + cuantas_letra(...,...)
  }
  letras = letras/N
  return(letras)
}

Usando un paquete

En este ejercicio vamos a usar el paquete MASS que instalamos en el tutorial. Por si no lo hicieron:

install.packages('MASS')
library(MASS)
  • Considere la siguiente matriz de \(R^{3 \times 2}\):
A = matrix(c(-1,3,2),nrow=1,byrow=TRUE)
print(A)

Calcule su núcleo (los vectores \(v\) de \(R^3\) tales que \(Av=0\)) manualmente.

  • Use la función Null del paquete MASS para calcular automáticamente una base del núcleo. ¿Es consistente con lo que calculó manualmente?

  • Construya una función proyeccion que retorne para un vector vector y una matriz A, el vector del núcleo más similar a vector proyectandolo al núcleo.

proyeccion = function(vector,A){
  nucleo = ...
  vector_proyectado = ...%*%vector
  return(vector_proyectado)
}

Conteo de números primos

  • Construya una función que detecte si un número entero es divisible o no por un conjunto de otros números. Tip: la operación %% aplica la operación módulo.

  • Construya una función que encuentre el número primo \(n+1\) a partir de una lista con los primeros \(n\) números primos.

  • Construya una función que encuentre los primeros \(n+1\) números primos.

Lectura de datos de nombres

datos = read.csv('nombre_del_archivo')
  • Encuentren los nombres más y menos comunes. Tip: la funciónes max y min retornan máximos y mínimos, y las funciones which.max y which.min identifican la (primera) posición en que estos ocurren. Comparen con usar la función which.

  • Encuentren el nombre que incluya la terminación el más común y el menos común. También el nombre que empiece con a más y menos común.

LS0tCnRpdGxlOiAiRWplcmNpY2lvcyBkZSBwcmVjYWxlbnRhbWllbnRvIgphdXRob3I6ICJBcmllbCBTYWxnYWRvIgpkYXRlOiAiMjAgZGUgSnVsaW8gZGUgMjAyMSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBsdW1lbgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCnN1YnRpdGxlOiAiTGFib3JhdG9yaW8gZGUgRGF0b3MiCi0tLQoKIyBFbiBlc3RlIG5vdGVib29rCgpFc3RlIG5vdGVib29rIGNvbnNpc3RlIGRlIGFsZ3Vub3MgZWplcmNpY2lvcyBzZW5jaWxsb3MgZGUgcGFyYSBmYW1pbGlhcml6YXJzZSBjb24gbGFzIGhlcnJhbWllbnRhcyBiw6FzaWNhcyBkZSBgUmAuCgojIEVqZXJjaWNpb3MKCiMjIyMgUmHDrWNlcyBkZSB1biBwb2xpbm9taW8KCkVzY3JpYmEgdW4gdHJvem8gKCBfY2h1bmtfICkgZGUgY8OzZGlnbyBlbiBlbCBxdWUgZGVmaW5hIGxvcyBjb2VmaWNpZW50ZXMgZGUgdW4gcG9saW7Ds21pbyBkZSBsYSBwaW50YSAkeSA9IGFfMCArIGFfMSB4ICsgYV8yIHheMiQgeSBjYWxjdWxlIGxhcyByYcOtY2VzIGRlbCBwb2xpbm9taW8gJHhfe1xwbX0gPSBcZnJhY3stYV8xIFxwbSBcRGVsdGF9ezJhXzJ9JCwgY29uICRcRGVsdGEgPSBcc3FydHthXzFeMi00YV8yYV8wfSTCtwoKYGBgCmFfMCA9IC0xCmFfMSA9IDAKYV8yID0gMQoKZGVsdGEgPSAuLi4KCnhfbWFzID0gKC1hXzEgKyBkZWx0YSkvKDIqYV8yKQp4X21lbm9zID0gLi4uCmBgYAoKIyMjIyBSYcOtY2VzIGRlIHVuIHBvbGlub21pbyAodjIpCgpDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSByZWNpYmEgbG9zIGNvZWZpY2llbnRlcyBkZSB1biBwb2xpbm9taW8geSByZXRvcm5lIGxhcyBwb3NpY2lvbmVzIGRlIHN1cyByYcOtY2VzLgoKYGBgCmNhbGN1bGFfcmFpY2VzID0gZnVuY3Rpb24oYV8wLGFfMSxhXzIpewogICMgQWPDoSBpbmNsdXlhbiBsbyBxdWUgYXJtYXJvbiBlbiBlbCBlamVyY2ljaW8gYW50ZXJpb3IKICByZXR1cm4oYyh4X21hcyx4X21lbm9zKSkKfQpgYGAKCiMjIyMgU3VtYSBkZSBuw7ptZXJvcyBlbnRlcm9zCgpDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSByZXRvcm5lIGxhIHN1bWEgZGUgbG9zIHByaW1lcm9zIGBOYCBuw7ptZXJvcyBlbnRlcm9zCgpgYGAKc3VtYV9lbnRlcm9zID0gZnVuY3Rpb24oTil7CiAgcmV0dXJuKHN1bSguLi4pKQp9CmBgYAoKIyMjIyBFc2NyaWJpZW5kbyBsZXRyYXMKClVzYW5kbyBsYSBmdW5jacOzbiBgc2FtcGxlYCBwdWVkZW4gZWxlZ2lyc2UgdW4gZWxlbWVudG8gYWwgYXphciBkZSB1biB2ZWN0b3I6CgpgYGB7cn0Kc2FtcGxlKDE6MyxzaXplPTEpCmBgYAoKSW1hZ2luZW1vcyB1biB0ZWNsYWRvIGVuIGVsIHF1ZSBzZSBhcHJldGFuIGxldHJhcyBhbCBhemFyIGhhc3RhIHF1ZSBzYWxlIHVuYSBsZXRyYSBfYV8uIMK/Q3VhbnRhcyBsZXRyYXMgc2UgZXNjcmliaXJhbiBlbiBnZW5lcmFsPyBQYXJhIHJlc3BvbmRlciBlc3RvOgoKKiBDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSBlbGlqYSB1bmEgbGV0cmEgYWwgYXphciBkZWwgYWJlY2VkYXJpbzoKCmBgYAplbGlnZV9sZXRyYSA9IGZ1bmN0aW9uKCl7CiAgYSA9IHNhbXBsZSguLi4sc2l6ZT0xKQogIHJldHVybiguLi4pCn0KYGBgCiogQ29uc3RydXlhIHVuYSBmdW5jacOzbiBxdWUgYWdyZWd1ZSBsZXRyYXMgYSB1bmEgcGFsYWJyYSBoYXN0YSBxdWUgc2FsZ2EgbGEgcHJpbWVyIGxldHJhIF9hXzoKCmBgYApjb25zdHJ1eWVfcGFsYWJyYSA9IGZ1bmN0aW9uKGxldHJhX3N0b3A9J2EnKXsKICBsZXRyYSA9IGVsaWdlX2xldHJhKCkKICBwYWxhYnJhID0gbGV0cmEKICB3aGlsZSguLi4pewogICAgbGV0cmEgPSAuLi4KICAgIHBhbGFicmEgPSBwYXN0ZShwYWxhYnJhLC4uLixzZXA9JycpCiAgfQogIHJldHVybihwYWxhYnJhKQp9CmBgYAoKKiBDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSBzZSBvY3VwZSBkZSBnZW5lcmFyIF9OXyBwYWxhYnJhcyB5IGNhbGN1bGUgbGEgbG9uZ2l0dWQgcHJvbWVkaW8gcXVlIHRpZW5lbi4gX0xhIGZ1bmNpw7NuIGBuY2hhcmAgY3VlbnRhIGxhIGNhbnRpZGFkIGRlIGNhcmFjdGVyZXMgZW4gdW4gc3RyaW5nLl8gwr9WZSBhbGd1bmEgcmVsYWNpw7NuIGVudHJlIGVsIG7Dum1lcm8gZGUgbGV0cmFzIGRpc3BvbmlibGVzIHkgbGEgbG9uZ2l0dWQgZGUgbGEgcGFsYWJyYT8KCmBgYApleHBlcmltZW50b19wYWxhYnJhcyA9IGZ1bmN0aW9uKE49MTAwLGxldHJhX3N0b3A9J2EnKXsKICBsb25naXR1ZCA9IDAKICBmb3IoaSBpbiAxOk4pewogICAgcGFsYWJyYSA9IC4uLgogICAgbG9uZ2l0dWQgPSAuLi4gKyBuY2hhcihwYWxhYnJhKQogIH0KICBsb25naXR1ZCA9IGxvbmdpdHVkL04KICByZXR1cm4obG9uZ2l0dWQpCn0KYGBgCgoqIEJhc2FuZG9zZSBlbiBsYSBmdW5jacOzbiBhbnRlcmlvciwgY29uc3RydXlhIG90cmEgZnVuY2nDs24gcXVlIGxlIHBlcm1pdGEgY2FsY3VsYXIgZWwgbsO6bWVybyBwcm9tZWRpbyBkZSBsZXRyYXMgX2RfIGVuIGxhcyBwYWxhYnJhcyBnZW5lcmFkYXMgYWwgYXphci4KCmBgYApjdWFudGFzX2xldHJhID0gZnVuY3Rpb24ocGFsYWJyYSxsZXRyYV9jb250YXIgPSAnYicpewogIHBhbGFicmFfc3BsaXQgPSBzdHJzcGxpdChwYWxhYnJhLCcnKVtbMV1dICMgRXN0byBkYSB1biB2ZWN0b3IgY29uIGxhcyBsZXRyYXMgdG9kYXMgc2VwYXJhZGFzCiAgY29udGVvID0gc3VtKC4uLj09Li4uKSAjIFVuYSBmb3JtYSBkZSBwZW5zYXJsbwogIHJldHVybihjb250ZW8pCn0KCmV4cGVyaW1lbnRvX2xldHJhcyA9IGZ1bmN0aW9uKE49MTAwLGxldHJhX3N0b3A9J2EnLGxldHJhX2NvbnRhciA9ICdiJyl7CiAgbGV0cmFzID0gMAogIGZvcihpIGluIDE6Til7CiAgICBwYWxhYnJhID0gLi4uCiAgICBsZXRyYXMgPSAuLi4gKyBjdWFudGFzX2xldHJhKC4uLiwuLi4pCiAgfQogIGxldHJhcyA9IGxldHJhcy9OCiAgcmV0dXJuKGxldHJhcykKfQpgYGAKCiMjIyMgVXNhbmRvIHVuIHBhcXVldGUKCkVuIGVzdGUgZWplcmNpY2lvIHZhbW9zIGEgdXNhciBlbCBwYXF1ZXRlIGBNQVNTYCBxdWUgaW5zdGFsYW1vcyBlbiBlbCB0dXRvcmlhbC4gUG9yIHNpIG5vIGxvIGhpY2llcm9uOgoKYGBgCmluc3RhbGwucGFja2FnZXMoJ01BU1MnKQpsaWJyYXJ5KE1BU1MpCmBgYAoKKiBDb25zaWRlcmUgbGEgc2lndWllbnRlIG1hdHJpeiBkZSAkUl57MyBcdGltZXMgMn0kOgoKYGBge3J9CkEgPSBtYXRyaXgoYygtMSwzLDIpLG5yb3c9MSxieXJvdz1UUlVFKQpwcmludChBKQpgYGAKQ2FsY3VsZSBzdSBuw7pjbGVvIChsb3MgdmVjdG9yZXMgJHYkIGRlICRSXjMkIHRhbGVzIHF1ZSAkQXY9MCQpIG1hbnVhbG1lbnRlLgoKKiBVc2UgbGEgZnVuY2nDs24gYE51bGxgIGRlbCBwYXF1ZXRlIGBNQVNTYCBwYXJhIGNhbGN1bGFyIGF1dG9tw6F0aWNhbWVudGUgdW5hIGJhc2UgZGVsIG7DumNsZW8uIMK/RXMgY29uc2lzdGVudGUgY29uIGxvIHF1ZSBjYWxjdWzDsyBtYW51YWxtZW50ZT8KCiogQ29uc3RydXlhIHVuYSBmdW5jacOzbiBgcHJveWVjY2lvbmAgcXVlIHJldG9ybmUgcGFyYSB1biB2ZWN0b3IgYHZlY3RvcmAgeSB1bmEgbWF0cml6IGBBYCwgZWwgdmVjdG9yIGRlbCBuw7pjbGVvIG3DoXMgc2ltaWxhciBhIGB2ZWN0b3JgIHByb3llY3RhbmRvbG8gYWwgbsO6Y2xlby4KCmBgYApwcm95ZWNjaW9uID0gZnVuY3Rpb24odmVjdG9yLEEpewogIG51Y2xlbyA9IC4uLgogIHZlY3Rvcl9wcm95ZWN0YWRvID0gLi4uJSoldmVjdG9yCiAgcmV0dXJuKHZlY3Rvcl9wcm95ZWN0YWRvKQp9CgpgYGAKCiMjIyMgQ29udGVvIGRlIG7Dum1lcm9zIHByaW1vcwoKKiBDb25zdHJ1eWEgdW5hIGZ1bmNpw7NuIHF1ZSBkZXRlY3RlIHNpIHVuIG7Dum1lcm8gZW50ZXJvIGVzIGRpdmlzaWJsZSBvIG5vIHBvciB1biBjb25qdW50byBkZSBvdHJvcyBuw7ptZXJvcy4gX1RpcDogbGEgb3BlcmFjacOzbl8gYCUlYCBfYXBsaWNhIGxhIG9wZXJhY2nDs24gbcOzZHVsb18uCgoqIENvbnN0cnV5YSB1bmEgZnVuY2nDs24gcXVlIGVuY3VlbnRyZSBlbCBuw7ptZXJvIHByaW1vICRuKzEkIGEgcGFydGlyIGRlIHVuYSBsaXN0YSBjb24gbG9zIHByaW1lcm9zICRuJCBuw7ptZXJvcyBwcmltb3MuCgoqIENvbnN0cnV5YSB1bmEgZnVuY2nDs24gcXVlIGVuY3VlbnRyZSBsb3MgcHJpbWVyb3MgJG4rMSQgbsO6bWVyb3MgcHJpbW9zLgoKIyMjIyBMZWN0dXJhIGRlIGRhdG9zIGRlIG5vbWJyZXMKCiogRW50cmVuIGVuIGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvb3Ryb3Mtbm9tYnJlcy1wZXJzb25hcy1maXNpY2FzIHkgZGVzY2FyZ3VlbiB1biBkYXRhc2V0IGRlIG5vbWJyZXMgcGFyYSB1biBhw7FvIGRlIHN1IGVsZWNjacOzbi4KCiogVXNlbiBsYSBmdW5jacOzbiBgcmVhZC5jc3ZgIHBhcmEgbGVlciBlbCBhcmNoaXZvIGVuIGZvcm1hdG8gYGRhdGEuZnJhbWVgLiBFeHBsb3JlbiBlbCBjb250ZW5pZG8gZGVsIG1pc21vLiDCv1F1w6kgaW5mb3JtYWNpw7NuIGhheSBlbiBsYXMgY29sdW1uYXM/CgpgYGAKZGF0b3MgPSByZWFkLmNzdignbm9tYnJlX2RlbF9hcmNoaXZvJykKYGBgCgoKKiBFbmN1ZW50cmVuIGxvcyBub21icmVzIG3DoXMgeSBtZW5vcyBjb211bmVzLiBfVGlwOl8gbGEgZnVuY2nDs25lcyBgbWF4YCB5IGBtaW5gIHJldG9ybmFuIG3DoXhpbW9zIHkgbcOtbmltb3MsIHkgbGFzIGZ1bmNpb25lcyBgd2hpY2gubWF4YCB5IGB3aGljaC5taW5gIGlkZW50aWZpY2FuIGxhIChwcmltZXJhKSBwb3NpY2nDs24gZW4gcXVlIGVzdG9zIG9jdXJyZW4uIENvbXBhcmVuIGNvbiB1c2FyIGxhIGZ1bmNpw7NuIGB3aGljaGAuCgoqIEVuY3VlbnRyZW4gZWwgbm9tYnJlIHF1ZSBpbmNsdXlhIGxhIHRlcm1pbmFjacOzbiBfZWxfIG3DoXMgY29tw7puIHkgZWwgbWVub3MgY29tw7puLiBUYW1iacOpbiBlbCBub21icmUgcXVlIGVtcGllY2UgY29uIF9hXyBtw6FzIHkgbWVub3MgY29tw7puLgoK