#la "c" es el nombre del vector y los valores en parentesis es 
#la definición del valor de c.
c(1,2.3,-0.56)
## [1]  1.00  2.30 -0.56
c
## function (...)  .Primitive("c")
#operador ":" es para indicar un rango
1:5
## [1] 1 2 3 4 5
15:20
## [1] 15 16 17 18 19 20
#la función secuencia permite que los valores que deseamos se
#desplieguen conforme a los valores que asignemos en este caso
#nos va a dar un vector con los valores de -1 hasta 1, para el 2
#caso nos dará un valor de -2 a 9
seq(-1,1,0.5)
## [1] -1.0 -0.5  0.0  0.5  1.0
seq(-2,9)
##  [1] -2 -1  0  1  2  3  4  5  6  7  8  9
#la función rep, repite los valores indicados en la función "c"
#parentesis hasta el numero de veces que se desee
rep(c(1,2),3)
## [1] 1 2 1 2 1 2
rep(c(3,4),4)
## [1] 3 4 3 4 3 4 3 4
rep(c(3:10),4)
##  [1]  3  4  5  6  7  8  9 10  3  4  5  6  7  8  9 10  3  4  5  6  7  8  9
## [24] 10  3  4  5  6  7  8  9 10
#la función c sirve para definir un vector de datos o una lista
#de datos, el resultado es 1.2 2.7 3.0 4.0 5.0
c(c(1.2,2.7),3:5)
## [1] 1.2 2.7 3.0 4.0 5.0
#el comando <- sirve para definir una variable
v<-1:5
v
## [1] 1 2 3 4 5
#append sirva paa pegar datos, en este caso del valor v y 
#cuando termina v pega los que se definen en la función c.
append(v,c(6,7))
## [1] 1 2 3 4 5 6 7
#LA FUNCIÓN C también acepta texto
c(T,F,F,T)
## [1]  TRUE FALSE FALSE  TRUE
#aqui termina clase 1

#en la documentación de R para el caso de la función c explica que 
#c es una función genérica que combina sus argumentos, el método predeterminado
#combina sus argumentos para formar un vector, todos los argumentos son obligados a 
#ser del mismo tipo, que es el tipo del valor dado y el único valor removido es texto.
c(1,7:9)
## [1] 1 7 8 9
c(1:5, 10.5, "next")
## [1] "1"    "2"    "3"    "4"    "5"    "10.5" "next"
#uses with a single argument to drop attributes
x <- 1:4
x
## [1] 1 2 3 4
#la funcion names es para obtener o definir los nombres de un atributo
#la funcion letters es para constantes en letra minuscula
#ahora x tiene letras y números
names(x) <- letters[1:4]
x
## a b c d 
## 1 2 3 4
#ahora tomamos la función c para tomar nuestro argumento que contiene letras y numeros
c(x) 
## a b c d 
## 1 2 3 4
#usando esta función removemos el texto de nuestro argumento
as.vector(x) 
## [1] 1 2 3 4
#funcion para recuperar la dimensión del argumento
dim(x)
## NULL
#el resultado es nulo porque no se ha definido la dimensión del argumento
x
## a b c d 
## 1 2 3 4
#función para definir la dimensión de un argumento
dim(x)<-c(2,2)
#muestra una matriz de 2x2, que es igual a la definición que hicimos
x
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
#a función c ahora sólo nos muestra 4 elementos en el argumento, ya no muestra las letras
c(x)
## [1] 1 2 3 4
#la funcion vector nos muestra los mismos 4 elementos numericos 
as.vector(x)
## [1] 1 2 3 4
## append to a list (pegar a una lista):
#nombramos a la lista "ll"
ll <- list(A = 1, c = "C")
ll
## $A
## [1] 1
## 
## $c
## [1] "C"
## do *not* use (no usar)
c(ll, d = 1:3) # which is == c(ll, as.list(c(d = 1:3))
## $A
## [1] 1
## 
## $c
## [1] "C"
## 
## $d1
## [1] 1
## 
## $d2
## [1] 2
## 
## $d3
## [1] 3
## but rather -mejor usar
c(ll, d = list(1:3))  # c() combining two lists
## $A
## [1] 1
## 
## $c
## [1] "C"
## 
## $d
## [1] 1 2 3
# If recursive = TRUE, the function recursively descends through lists (and pairlists) combining all their elements into a vector.
c(list(A = c(B = 1)), recursive = TRUE)
## A.B 
##   1
c(list(A = c(B = 1, C = 2), B = c(E = 7)), recursive = TRUE)
## A.B A.C B.E 
##   1   2   7
# }

#otros básicos:NO MUCHAS LINEAS DE EXPLICACIÓN
#MATRICES
M = matrix( c('a','a','b','c','b','a'), nrow = 2, ncol = 3, byrow = TRUE)
M
##      [,1] [,2] [,3]
## [1,] "a"  "a"  "b" 
## [2,] "c"  "b"  "a"
print(M)
##      [,1] [,2] [,3]
## [1,] "a"  "a"  "b" 
## [2,] "c"  "b"  "a"
M = matrix( c('a','a','b','c','b','a','E','F','G'), nrow = 3, ncol = 3, byrow = TRUE)
print(M)
##      [,1] [,2] [,3]
## [1,] "a"  "a"  "b" 
## [2,] "c"  "b"  "a" 
## [3,] "E"  "F"  "G"
#ARRAY dim=c(3,3) dimension matriz y ,2 numero de matrices
a <- array(c('green','yellow'),dim = c(3,3,2))
print
## function (x, ...) 
## UseMethod("print")
## <bytecode: 0x000000001c1db7c8>
## <environment: namespace:base>
b <- array(c('green','yellow'),dim = c(2,2,2))
print(b)
## , , 1
## 
##      [,1]     [,2]    
## [1,] "green"  "green" 
## [2,] "yellow" "yellow"
## 
## , , 2
## 
##      [,1]     [,2]    
## [1,] "green"  "green" 
## [2,] "yellow" "yellow"
c <- array(c('green','yellow'),dim = c(2,2,3))
print(c)
## , , 1
## 
##      [,1]     [,2]    
## [1,] "green"  "green" 
## [2,] "yellow" "yellow"
## 
## , , 2
## 
##      [,1]     [,2]    
## [1,] "green"  "green" 
## [2,] "yellow" "yellow"
## 
## , , 3
## 
##      [,1]     [,2]    
## [1,] "green"  "green" 
## [2,] "yellow" "yellow"
d <- array(c('green','yellow','red'),dim = c(2,2,3))
print(d)
## , , 1
## 
##      [,1]     [,2]   
## [1,] "green"  "red"  
## [2,] "yellow" "green"
## 
## , , 2
## 
##      [,1]     [,2]    
## [1,] "yellow" "green" 
## [2,] "red"    "yellow"
## 
## , , 3
## 
##      [,1]    [,2]    
## [1,] "red"   "yellow"
## [2,] "green" "red"
l<-list(3.2,"Hola", TRUE, 2+4i)
l
## [[1]]
## [1] 3.2
## 
## [[2]]
## [1] "Hola"
## 
## [[3]]
## [1] TRUE
## 
## [[4]]
## [1] 2+4i
#los elementos de una lista están enumerados 
alumno<-list(nota=7.2,nombre="N.Fernandez",aprobado=TRUE)
alumno$nota
## [1] 7.2
#elemnto 2 del objeto alumno.
alumno[[2]]
## [1] "N.Fernandez"
#se puede abreviar el nombre del campo, pero si hay alguno inicia con el mismo nombre
#el resultado sera null
alumno$no
## NULL
#funcion lapply para aplicar una función a los elementos de una lista
l<-list(a=seq(1,4),b=rep(1,4))
l
## $a
## [1] 1 2 3 4
## 
## $b
## [1] 1 1 1 1
lapply(l,sum) #para cada uno de los elementos de la lista sumamos sus componentes
## $a
## [1] 10
## 
## $b
## [1] 4
#se usa para especificar los niveles que consta una clasificación discreta (variable categórica)
dias<-factor(levels=c("L","M","X","J","V"))
levels(dias)
## [1] "L" "M" "X" "J" "V"
#funcion cut para convertir una variable continua en discreta.
notas<-c(1.7,6.4,5.3,9.8,3.5,7.8)
cut(notas,breaks=c(0,5,7.5,9,10))
## [1] (0,5]   (5,7.5] (5,7.5] (9,10]  (0,5]   (7.5,9]
## Levels: (0,5] (5,7.5] (7.5,9] (9,10]
cut(notas, breaks=c(0,5,7.5,9,10), labels=c("Sus","Apr","Not","Sob"))
## [1] Sus Apr Apr Sob Sus Not
## Levels: Sus Apr Not Sob
#funcion tapply para factores
alturas<- c(1.75, 1.68, 1.72, 2.03, 1.73, 1.69, 1.83, 1.92)
grupos<-factor(rep(c("Grupo1","Grupo2"),4))
grupos
## [1] Grupo1 Grupo2 Grupo1 Grupo2 Grupo1 Grupo2 Grupo1 Grupo2
## Levels: Grupo1 Grupo2
tapply(alturas,grupos, mean)
## Grupo1 Grupo2 
## 1.7575 1.8300
alturas<- c(1.75, 1.68, 1.72, 2.03, 1.73, 1.69, 1.83, 1.92)
alturas
## [1] 1.75 1.68 1.72 2.03 1.73 1.69 1.83 1.92
#factores:variables categóricas
grupos<-factor(rep(c("Grupo1","Grupo2"),4))
grupos
## [1] Grupo1 Grupo2 Grupo1 Grupo2 Grupo1 Grupo2 Grupo1 Grupo2
## Levels: Grupo1 Grupo2
tabla<-data.frame(Alturas=alturas,Grupos=grupos)
tabla
##   Alturas Grupos
## 1    1.75 Grupo1
## 2    1.68 Grupo2
## 3    1.72 Grupo1
## 4    2.03 Grupo2
## 5    1.73 Grupo1
## 6    1.69 Grupo2
## 7    1.83 Grupo1
## 8    1.92 Grupo2
#cambio de etiquetas 
colnames(tabla)<-c("Alt","Grp")
rownames(tabla)<-c("U1","U2","U3","U4","U5","U6","U7","U8")
tabla
##     Alt    Grp
## U1 1.75 Grupo1
## U2 1.68 Grupo2
## U3 1.72 Grupo1
## U4 2.03 Grupo2
## U5 1.73 Grupo1
## U6 1.69 Grupo2
## U7 1.83 Grupo1
## U8 1.92 Grupo2
#los nombres pueden ayudarnos a acceder a la tabla
tabla$Alt
## [1] 1.75 1.68 1.72 2.03 1.73 1.69 1.83 1.92
tabla[5,]
##     Alt    Grp
## U5 1.73 Grupo1
tabla["U5",]
##     Alt    Grp
## U5 1.73 Grupo1
#Añadir nuevas entradas
#columnas
tabla$Nueva<-seq(1,8)
tabla
##     Alt    Grp Nueva
## U1 1.75 Grupo1     1
## U2 1.68 Grupo2     2
## U3 1.72 Grupo1     3
## U4 2.03 Grupo2     4
## U5 1.73 Grupo1     5
## U6 1.69 Grupo2     6
## U7 1.83 Grupo1     7
## U8 1.92 Grupo2     8
#filas
tabla["U9",]<-list(Alt=1.59,Grp="Grupo2",Nueva=9)
tabla
##     Alt    Grp Nueva
## U1 1.75 Grupo1     1
## U2 1.68 Grupo2     2
## U3 1.72 Grupo1     3
## U4 2.03 Grupo2     4
## U5 1.73 Grupo1     5
## U6 1.69 Grupo2     6
## U7 1.83 Grupo1     7
## U8 1.92 Grupo2     8
## U9 1.59 Grupo2     9
#tambien es posible acceder a los datos de una tabla utilizando indices
#fila
tabla[1,]
##     Alt    Grp Nueva
## U1 1.75 Grupo1     1
#columna
tabla[,1]
## [1] 1.75 1.68 1.72 2.03 1.73 1.69 1.83 1.92 1.59
#posicion especifica
tabla[3,1]
## [1] 1.72
#obtención de nombres 
names(tabla)
## [1] "Alt"   "Grp"   "Nueva"
dimnames(tabla)
## [[1]]
## [1] "U1" "U2" "U3" "U4" "U5" "U6" "U7" "U8" "U9"
## 
## [[2]]
## [1] "Alt"   "Grp"   "Nueva"
#dimensiones tabla
dim(tabla)
## [1] 9 3
nrow(tabla)
## [1] 9
ncol(tabla)
## [1] 3
#estructura de la tabla
str(tabla)
## 'data.frame':    9 obs. of  3 variables:
##  $ Alt  : num  1.75 1.68 1.72 2.03 1.73 1.69 1.83 1.92 1.59
##  $ Grp  : Factor w/ 2 levels "Grupo1","Grupo2": 1 2 1 2 1 2 1 2 2
##  $ Nueva: num  1 2 3 4 5 6 7 8 9
#estructuras de control 
#ifelse expresion de tres argumentos, expresión de evaluación,cuando es cierta y cuando es falsa
x<-c(1,-2,4,-3.2,0.-9)
y<-ifelse(x<0,-x+1,x)
y
## [1]  1.0  3.0  4.0  4.2 10.0
#permiten repetir el código cierto numero de veces 
#1.for:recorre elementos de una secuencia y repite el código que se proporciona
total<-0
for (i in c(2,3,5,8)) {
  total<-total+i
}
total
## [1] 18
#2.while:se ejecuta el codigo mientras se cumpla la condicion
y<-0; suma<-0
while (y<5){
  suma<- suma+y
  y<-y+1
}
suma
## [1] 10
y
## [1] 5
y<-0; suma<-0
while (y<4){
  suma<- suma+y
  y<-y+1
}
suma
## [1] 6
y
## [1] 4
#3.repeat:se repite cierto código hasta que se ejecuta un break
#que indica que saldremos del bucle
y<-0; suma<-0
repeat {
  suma<- suma+y
  y<-y+1
  if (y==5)break
}
suma
## [1] 10
y
## [1] 5
#es mas eficiente usar funciones a bucles.
#nos permite crear nuestras propias funciones 
sumprod<-function(x,y){
  return((x+y)/(x*y))
}
#hemos definido una función de nombre sumprod que tiene
#dos parametros de entrada x y y que devuelve un resultado con "return"
sumprod(2,3)
## [1] 0.8333333
#también es posible definir nuevos operadores binarios, asignando el 
#símbolo del operador a utilizar el lugar del nombre de la función:
"%@%"<-function(x,y){
  return((x+y)/(x*y))
}
2%@%3
## [1] 0.8333333
#también es posible especificar valores por defecto en los parametros 
#de la función
sumprod<-function(x,y=1){
  return((x+y)/(x*y))
}
sumprod(3)
## [1] 1.333333
#inclusive se puede que los valores se obtengan a partir de parametros
sumprod<-function(x,y=length(x)){
  return((x+y)/(x*y))
}
v<-seq(1,3)
sumprod(v)
## [1] 1.3333333 0.8333333 0.6666667
#podemos utilizar la funcion missing para comprobar si un determinado
#parametro ha sido proporcionado o no a la hora de llamar nuestra función:
f<-function(x=1,y){
  if (missing(y)){
    y<-2
  }
  return(x+y)
}
#evaluamos la funcion en 2
f(2)
## [1] 4
f(2,3)
## [1] 5
#parametros adicionales que no son conocidos al momento de declarar la funcion
f<-function(x,y=2,...){
  args<-list(...) #obtenemos lista de argumentos
  for (arg in args){ #recorremos la lista
    print(arg)
    }
}