1.1 R Interactivo

seq(1, 10, by=2)
## [1] 1 3 5 7 9
1:30
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30

Describe que hace. Utilízala para crear números del 1 al 30 con un incremento de 0.5.¿Qué otros parámetros te ofrece la función seq()? Utilízalos en un ejemplo.

help(seq)

?"seq"

La función seq() crea secuencias de números desde un inicio a un final, y en unos incrementos determinados por su argumento by.

seq(1,30, by=0.5)
##  [1]  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5
## [15]  8.0  8.5  9.0  9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5
## [29] 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5 20.0 20.5 21.0 21.5
## [43] 22.0 22.5 23.0 23.5 24.0 24.5 25.0 25.5 26.0 26.5 27.0 27.5 28.0 28.5
## [57] 29.0 29.5 30.0

Parámetros adicionales como length.out, donde especificamos cuantos “cortes” daremos a nuestra secuencia, por ejemplo, de 1 a 30 en 3 “pasos” o “cortes”.

seq(1,30, length.out=3)
## [1]  1.0 15.5 30.0

Otro parametro es along.with, usado para obtener el tamaño que obtendremos tras alguna generacion pero que se encuentra en desuso ya que la funcion seq_along facilita enormemente las cosas.

seq(along.with=1)
## [1] 1

seq(4,length.out=30)

*Crea letras minúsculas, mayúsculas, nombre de los meses del año y nombre de los meses del año abreviado

letters
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
LETTERS
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
## [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
month.name
##  [1] "January"   "February"  "March"     "April"     "May"      
##  [6] "June"      "July"      "August"    "September" "October"  
## [11] "November"  "December"
month.abb
##  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"
## [12] "Dec"
help(rep)

rep(1:8, times=5)
##  [1] 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3
## [36] 4 5 6 7 8
rep(LETTERS[1:8], times=5)
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "A" "B" "C" "D" "E" "F" "G" "H" "A"
## [18] "B" "C" "D" "E" "F" "G" "H" "A" "B" "C" "D" "E" "F" "G" "H" "A" "B"
## [35] "C" "D" "E" "F" "G" "H"

1.2 Vectores

  1. un vector del 1 al 20
  2. un vector del 20 al 1
  3. Utilizando el comando c() crea un vector que tenga el siguiente patrón 1,2,3,4,5…20,19,18,17….1
vector<-1:20

vector2<-20:1

vector3<-c(1:20,19:1)
x<-1:9

x<-seq(1,9)

x<-c(1:9)
x<-seq(1,5,length.out = 9)

*Busca que hace la función sequence(). ¿Cual es la diferencia con la función seq()

help(sequence)

La función sequence genera y concatena vectores de enteros, es decir por cada elemento de un vector que le pasemos como argumento, generara y concatenrá elementos desde el 1 hasta el valor de la posición x del vector. Por ejemplo la siguiente función generará valores del 1 al 5 y lo concatena con valores del 1 al 8 y del 1 al 9 en un solo vector.

sequence(c(5,8,9))
##  [1] 1 2 3 4 5 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9

sequence es menos útil a mi juicio que seq, ya que este último nos permite generar secuencias que aumentan por unidades lógicas, sequence puede concatenar los resultados y seq no.

x<-c(1:20)
x[2]
## [1] 2

*Crea un vector numérico “z” que contenga del 1 al 10. Cambia el modo del vector a carácter.

z<-c(1:10)
z<-as.character(z)
typeof(z[1])
## [1] "character"
z<-as.integer(z)
typeof(z[3])
## [1] "integer"
help(scan)
#Hemos creado el fichero data.txt que contiene 1 2 3 4
z<-scan("datasets/data.txt")
z[2]
## [1] 2
x<-c(1:100)
help(sample)
sample(x,5)
## [1] 80 95 41 76 27
help(runif)

vector<-sort(as.integer(runif(100,1,4)))

order(vector, decreasing = TRUE)
##   [1]  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79
##  [18]  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
##  [35]  97  98  99 100  26  27  28  29  30  31  32  33  34  35  36  37  38
##  [52]  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55
##  [69]  56  57  58  59  60  61  62   1   2   3   4   5   6   7   8   9  10
##  [86]  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25
vector2<-c(vector[order(vector, decreasing = TRUE)])

La diferencia con la funcion sort es que order nos devuelve las posiciones donde se debería de permutar para obtener el orden deseado.

x<-c(1:10)
help(rep)
x<-rep(x,4)
x<-unique(x)
x<-c(1:40)

help(sample)

sample(x,30)
##  [1] 25 13 11  4 15 33  1 22 32  5  3  6 27 29 23 28  2 19 20 12 39 35 31
## [24] 36  7 14 16 34 37 30
#Si queremos que salgan repetidos es decir, con reemplazo
sample(x, 30, replace = TRUE)
##  [1] 12 35  8 31  5  2 26 37  6 29 11  2 30  6  8 12 30 31  6  7 20 19 16
## [24] 22 40  8 37 11 10 29
#Si queremos que no salgan repetidos es decir, sin reemplazo
sample(x, 30, replace = FALSE)
##  [1] 16  5 38 40  4 21 20  8  9 11 19 35 27 33 15 14 32 28  7 34 36 24 22
## [24] 17 26 25  6 12  1 10
help(ls)
ls()
##  [1] "A"                "all_wars_matrix"  "año"             
##  [4] "array_datos"      "b1"               "b2"              
##  [7] "beavers"          "c"                "c2"              
## [10] "cambio"           "cinco"            "co_2ordered"     
## [13] "colours"          "consonantes"      "creciente"       
## [16] "dates"            "dia"              "dos"             
## [19] "empire_strikes"   "f"                "fechas"          
## [22] "frase"            "hits"             "i"               
## [25] "impares"          "inicial"          "input"           
## [28] "irisfactor"       "j"                "listFechas"      
## [31] "logicVector"      "m"                "m1"              
## [34] "M1"               "m2"               "M2"              
## [37] "marray"           "max"              "mayorquesiete"   
## [40] "mes"              "min"              "minorMurder"     
## [43] "montecarlo"       "mtcars"           "my_list"         
## [46] "my_list2"         "new_hope"         "nombre"          
## [49] "non_us_all"       "non_us_some"      "numero"          
## [52] "numeros"          "partir"           "pos"             
## [55] "responses"        "return_jedi"      "s"               
## [58] "salida"           "sinrepetidos"     "splitConsonantes"
## [61] "splitFrase"       "splitVocales"     "star_wars_matrix"
## [64] "string"           "strings"          "students"        
## [67] "students.female"  "students.male"    "students.new"    
## [70] "subb"             "sym"              "testlist"        
## [73] "testmatrix"       "tres"             "unir"            
## [76] "v"                "v1"               "v2"              
## [79] "vector"           "vector2"          "vector3"         
## [82] "vocales"          "vyc"              "women"           
## [85] "worldwide_vector" "x"                "x1"              
## [88] "x2"               "xmatrix"          "y"               
## [91] "ymatrix"          "z"
help(objects)
objects()
##  [1] "A"                "all_wars_matrix"  "año"             
##  [4] "array_datos"      "b1"               "b2"              
##  [7] "beavers"          "c"                "c2"              
## [10] "cambio"           "cinco"            "co_2ordered"     
## [13] "colours"          "consonantes"      "creciente"       
## [16] "dates"            "dia"              "dos"             
## [19] "empire_strikes"   "f"                "fechas"          
## [22] "frase"            "hits"             "i"               
## [25] "impares"          "inicial"          "input"           
## [28] "irisfactor"       "j"                "listFechas"      
## [31] "logicVector"      "m"                "m1"              
## [34] "M1"               "m2"               "M2"              
## [37] "marray"           "max"              "mayorquesiete"   
## [40] "mes"              "min"              "minorMurder"     
## [43] "montecarlo"       "mtcars"           "my_list"         
## [46] "my_list2"         "new_hope"         "nombre"          
## [49] "non_us_all"       "non_us_some"      "numero"          
## [52] "numeros"          "partir"           "pos"             
## [55] "responses"        "return_jedi"      "s"               
## [58] "salida"           "sinrepetidos"     "splitConsonantes"
## [61] "splitFrase"       "splitVocales"     "star_wars_matrix"
## [64] "string"           "strings"          "students"        
## [67] "students.female"  "students.male"    "students.new"    
## [70] "subb"             "sym"              "testlist"        
## [73] "testmatrix"       "tres"             "unir"            
## [76] "v"                "v1"               "v2"              
## [79] "vector"           "vector2"          "vector3"         
## [82] "vocales"          "vyc"              "women"           
## [85] "worldwide_vector" "x"                "x1"              
## [88] "x2"               "xmatrix"          "y"               
## [91] "ymatrix"          "z"

1.3 Indexado de Vectores

x <- 1:10
names(x) <- letters[x]

x[1:3]
## a b c 
## 1 2 3
x[c(1,10)]
##  a  j 
##  1 10
x[c(-1,-2)]
##  c  d  e  f  g  h  i  j 
##  3  4  5  6  7  8  9 10
x[ x > 5]
##  f  g  h  i  j 
##  6  7  8  9 10
x[c("a","d")]
## a d 
## 1 4
x[]
##  a  b  c  d  e  f  g  h  i  j 
##  1  2  3  4  5  6  7  8  9 10
x <- 1:10; 
y <- c(x[1:5],99,x[6:10]);
y
##  [1]  1  2  3  4  5 99  6  7  8  9 10
vector<-1:100

vector[2:23]
##  [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
vector[c(1,24:100)]
##  [1]   1  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
## [18]  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56
## [35]  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73
## [52]  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
## [69]  91  92  93  94  95  96  97  98  99 100
vector[5]<-99
vector[5]
## [1] 99
logicVector<-letters=="c"
which(rep(letters,2)=="c") 
## [1]  3 29

Nos devuelve las posiciones en las que encuentra la letra c. Son dos ya que repite el vector letters dos veces.

match(c("c","g"), letters) 
## [1] 3 7

Nos devuelve las posiciones en las que encuentra las letras que le pasamos en el primer argumento.

x<-(-5:6)

#elementos de x menores que  0

x[x<0]
## [1] -5 -4 -3 -2 -1
#elementos de x menores o igual que 0

x[x<=0]
## [1] -5 -4 -3 -2 -1  0
#elementos of x mayor o igual que 3

x[x>=3]
## [1] 3 4 5 6
#elementos de x menor que 0 o mayor que  4

x[x<0|x>4]
## [1] -5 -4 -3 -2 -1  5  6
#elementos de x mayor que 0 y menor que 4

x[x>0&x<4]
## [1] 1 2 3
#elementos de x distintos de 0

x[x!=0]
##  [1] -5 -4 -3 -2 -1  1  2  3  4  5  6
x<- c(1,2,NA)
is.na(x)
## [1] FALSE FALSE  TRUE
x[x!=NA]
## [1] NA NA NA

De este modo no se obtienen los valores perdidos si no que nos ofrece todos los valores como si fueran na. Creo que se debe a que los tipos de un vector son los mismos y por lo tanto al crear un vector de enteros el NA está cambiando su tipo lógico por defecto a entero y la evaluación del mismo no es correcta.

1.4 Búsqueda de valores idénticos y distintos en Vectores

intersect(month.name[1:4],month.name[3:7])
## [1] "March" "April"
v1<-c(1:6)
v2<-c(3:9)
v1[v1 %in% v2]
## [1] 3 4 5 6
x=month.name[1:4]
y=month.name[3:7]

class(x)
## [1] "character"
class(y)
## [1] "character"
setdiff(x,y)
## [1] "January"  "February"

Si que puede usarse con tipos de clase caracteres, de hecho tendremos problemas con setdiff si pasamos argumentos de distintos tipos, pero si son iguales como es el caso no tendremos problema alguno.

help(union)
x=month.name[1:4]
y=month.name[1:7]
union(x,y)
## [1] "January"  "February" "March"    "April"    "May"      "June"    
## [7] "July"
intersect(x, y)
## [1] "January"  "February" "March"    "April"

1.5 Filtrado de Vectores, subset(), which(), ifelse()

R permite extraer elementos de un vector que satisfacen determinadas condiciones. Es una de las operaciones más comunes.

z<-c(5,2,-3,8)

z[z^2>8]
## [1]  5 -3  8

R permite extraer elementos de un vector que satisfacen determinadas condiciones usando la función subset(), la diferencia entre esta función y el filtrado normal es como funciona con NA, subset() los elimina automáticamente del cálculo.

x <- c(6,1:3,NA,12)
x[x>5]
## [1]  6 NA 12
subset(x, x>5)
## [1]  6 12

R permite extraer encontrar las posiciones en las que se encuentran los elementos que cumplen una determinada condición con which().

z <- c(5,2,-3,8)
help(which)
which(z^2>8)
## [1] 1 3 4
vector<-c(1:30)
help(ifelse)
ifelse(vector%%2==0, print("5"), print("12"))
## [1] "5"
## [1] "12"
##  [1] "12" "5"  "12" "5"  "12" "5"  "12" "5"  "12" "5"  "12" "5"  "12" "5" 
## [15] "12" "5"  "12" "5"  "12" "5"  "12" "5"  "12" "5"  "12" "5"  "12" "5" 
## [29] "12" "5"
x <- c(5,2,9,12)
ifelse(x>6, x*2, x*3)
## [1] 15  6 18 24