# Introducció

En R es diu que tot són objectes. En R, un objecte és qualsevol cosa que es pot assignar a una variable. Això inclou constants, estructures de dades, funcions, i fins i tot gràfics. Els objectes tenen una mode (que es descriu com s'emmagatzema l'objecte) i una class (que diu quin tipus d'objecte és). El manual del llenguatge és pot consultar a .

# Tipus de dades

En R les variables es poden emmagatzemar com diferents tipus de dades o "classes".
Existeixen cinc tipus de dades bàsiques (veure Tipus de variables ):
* Caràcters.
* Nombres (nombres reals).
* Enters.
* Nombres complexos.
* Lògics (Verdader / Fals).
Aquestes s'agrupen en unes classes de dades més complexes:
* Vectors: tots els elements són del mateix tipus (p. ex., tots han de ser caràcters o tots enters).
* Llistes: els elements poden ser de tipus diferents.
* Factors: s'utilitzen per representar les dades categòriques. Hom pot pensar en un factor com un vector d'enters on cada nombre té una etiqueta. Els factors poden ser ordenats o no.
* Matrius.
* Arrays. Són matrius de qualsevol nombre de dimensions.
* Taules de dades. Son matrius on les variables són de qualsevol tipus i és una estructura similar als conjunts de dades que es troben en els paquets estadístics estàndard. Les columnes són variables i les files són observacions. Una taula de dades pot tenir diferents tipus de variables (p. ex., numèriques, caràcters). Les taules de dades són les principals estructures que utilitzarà per emmagatzemar conjunts de dades. Típicament es crea quan es llegeix i s'importa un fitxer de dades.
Per saber el tipus d'un objecte determinat s'utilitza l'ordre class(<Nom d'objecte>).
Per tant, hi ha moltes maneres diferents per emmagatzemar les variables en R (és a dir, objectes), i cada una d'elles correspon a un tipus d'objecte diferent ("classes"). A continuació és presenten alguns dels objectes més emprats juntament amb la seva descripció i la classe corresponent:
| Objecte | Descricció | Tipus (Class) |
| Nombre Individual o lletra / paraula | Només un sol número o caràcter o paraula o frase entre cometes | Numèrica o de caràcters |
| Vector | Un vector de tots números o tots caràcters | O tots nombres o tots caràcter |
| Matriu | Té columnes i files - totes les entrades són de la mateixa classe | O tots nombres o tots caràcter |
| Taula de dades | Igual que una matriu però columnes poden ser de diferents tipus (classes) | data.frame |
| Llista | Un munt de diferents objectes tots agrupats sota un mateix nom | list |

# Operadors
## Aritmètics

X + Y : Suma
X - Y : Resta
X * Y : Multiplicació
X / Y : Divisió
X ^ Y : Potència
X %% Y: Mòdul
X %/% Y : Divisió entera

## Relacionals

X < Y
X > Y
X <= Y
X >= Y
X == Y
X != Y

## Lògics

! X Negació
X && Y
X & Y
X || Y
X | Y

# Funcions

sum(nom_variable) Ens suma tots els valors de la variable. Si volem sumar els valors de l'1 al 20 fem:
sum(c(1:20))
sort(nom_variable) Ordena els valors d'una variable.
sqrt(nom_variable) Arrel quadrada.
^ Potència.
mean Mitja aritmètica.
summary Fa un resum d'estadística descriptiva de la variable.
sample(nom_variable,longitud) Agafa una mostra aleatòria de la longitud desitjada entre tots els valors de la mostra.
runif(n) Genera una successió de n nombres aleatoris segons una llei uniforme.
rnorm Genera una successió de n nombres aleatoris segons una llei normal.
length Diu el nombre de posicions del vector.
Prod El producte dels elements d'un vector.
prod(c(1:20))
exp(sum(log(c(1:20))))
Seguin la classificació de Kabacoff (, pàg 42, 93-102), es classificaran en:
* Per treballar amb objectes de dades
* Per gestionar l'espai de treball de R
* Matemàtiques
* Estadístiques
* Probabilitats
* Per text
* Per directoris i fitxers externs
* Altres

## Funcions per treballar amb objectes de dades

Algunes de les funcions que cita Kabacoff ( pag. 42-43) són:
* c (<Nom objecte 1er>, <Nom objecte 2n>, ...): combina objectes en un vector.
* cbind (<Nom objecte 1er>, <Nom objecte 2n>, ...): combina objectes en columnes.
* rbind (<Nom objecte 1er>, <Nom objecte 2n>, ...): combina objectes en files.
* class (<Nom objecte>): mostra el tipus d'objecte.
* head (<Nom objecte>): mostra la part inicial de l'objecte.
* tail (<Nom objecte>): mostra la part final de l'objecte.
* length (<Nom objecte>): mostra el nombre d'elements o de components d'un objecte.
* ls: llista els objectes.
* names (<Nom objecte>): mostra els noms dels components d'un objecte.
* rm (<Nom objecte 1er>, <Nom objecte 2n>, ...): esborra els objectes llistats.
* str (<Nom objecte>): mostra l'estructura d'un objecte.

## Funcions per gestionar l'espai de treball de R

Algunes de les funcions que cita Kabacoff ( pag. 12) són:
* getwd
* setwd("El meu directori")
* ls: És com llistar totes les variables.
* rm: Per esborrar una variable hem d'utilitzar l'instrucció "rm(nom_variable)".
* rm(<llista d'objectes>)
* help(options)
* options
* history(<número>): mostra les darrers <nombre> ordres
* save(<llista d'objectes>, file="<nom de fitxer>"): desa els objectes

## Funcions per les dades en R

* c(valor, valor, ...): combina els valors (numèrics, caràcter) en un vector. La "c" és de "combine". Serveix per crear vectors.

   ### Exemples

      * X = c(0,5, 0,6) # numèric
      * X = c(TRUE, FALSE) ## Lògic
      * X = c(T, F) ## Lògic
      * X = c("a", "b") ## Caràcter
* names(<DADES>): torna els noms de les columnes de la nostra taula, és a dir, els noms de les variables.
* ncol(<DADES>): nombre de variables (nombre de columnes) d'una taula de dades.
* nrow(<DADES>): nombre de registres (nombre de files) d'una taula de dades.

### Funcions que realitzen bucles

Quan es treballa de forma interactiva, es complicat escriure bucles amb for o while. Existeixen unes funcions per realitzar-los de forma senzilla:
* lapply: recorre els elements d'una llista i avaluar una funció en cada un d'ells de forma consecutiva.
* sapply: igual que lapply, però intenta simplificar el resultat.
* apply: aplica una funció sobre els marges d'una matriu.
* tapply: aplica una funció sobre els subconjunts d'un vector.
* mapply: és una versió multivariada de lapply.
És molt útil utilitzar la funció split amb aquestes funcions, especialment amb lapply o sapply, ja que permet trossejar un objecte.

#### apply

Tècnicament "retorna un vector o matriu o llista de valors obtinguts mitjançant l'aplicació d'una funció als marges d'una matriu o matriu". A la pràctica, és útil per calcular, p. ex., el valor mitjà o el valor màxim, de:
* Una sèrie de variables d'una taula de dades (p. ex., la mitjana o el màxim d'una sèrie de variables de cada observació o fila).
* Una variable d'una taula de dades (p. ex., la mitjana o el màxim d'una variable). Aquest cas és poc útil, ja que és més fàcil l'ordre mean(<Nom de la variable de la taula de dades>).
El paràmetre de la funció apply són:
* Nom de la taula de dades.
* Marge sobre el que aplicar la funció:
** 1: sobre les files.
** 2: sobre les columnes.
** c(1, 2): sobre files i columnes.
* La funció a aplicar (p. ex., mean, max, sum o inclús sort)
Per exemple, per calcular la mitjana de les variables V1 i V2 quantitatives d'una taula de dades:
Si existeixen valors desconeguts en el valors d'alguna de les variables, es pot fer servir l'opció na.rm = TRUE a fi de que calculi la mitjana (o altre funció) amb la resta de valors coneguts:
Si només es volgués aplicar la funció a un grup de variable, es poden seleccionar pel seu nom:
Amb la ordre DADES[, c("V1", "V2")] es seleccionen totes les observacions (el valor de les files està en blanc a l'ordre [ , c("V1", "V2")]) de les variable V1 i V2.

#### lapply

Processa les observacions d'una variable d'una taula de dades (o d'una llista) i avalua una funció en cada element. Sol tenir només dos arguments, una llista (que pot ser, p. ex., una taula de dades o una variable d'una taula de dades) i el nom d'una funció (que pot ser una del propi R o escrita per un mateix), encara que després pot tenir arguments addicionals (indicats a la sintaxis següent per "..."):
Si el primer argument no és una llista, es pot forçar que ho sigui (si és possible), amb as.list.
En l'exemple següent, s'arrodoneix els valors de la pressió arterial diastòlica aplicant la funció round a cada un dels valors i després es calcula la mitjana de les variables d'una taula de dades (edat i pressió arterial diastòlica):
En el primer exemple (arrodonir els valors), el mateix resultat s'obtindria de forma més directa amb l'ordre DADES$PAD = round(DADES$PAD).
En el segon exemple, a la funció se li passa l'argument addicional na.rm = TRUE, ja que la variable edat presenta un valor desconegut. Sense aquest argument, el resultat de la mitjana de l'edat seria NA.
En el següent exemple de Computing for Data Analysis es genera un número variable de nombres aleatoris amb la funció runif (aquesta genera tants nombres aleatoris com el nombre que se li passa com argument):
A la funció runif se li passa consecutivament com argument 1, 2, 3 i 4. Per tant, primer genera un sol nombre aleatori (0.6403106), després en genera dos (0.009495756 0.232550506), després 3 (0.6660838 0.5142511 0.6935913) i, finalment, quatre. Si es volgués que els nombres aleatoris prenguessin valors entre 0,1 i 10, es poden passar aquests valors com arguments de la funció lapply:
La funció lapply sempre torna una llista d'elements.

#### sapply

Realitza la mateixa funció que lapply, però intenta tornar el resultat més simple possible. Per exemple:
* Si el resultat és una llista en la que cada element té una longitud de 1, llavors en lloc de tornar una llista, torna un vector.
* Si el resultat és una llista en que cada element és un vector de la mateixa longitud i major de 1, la funció torna una matriu.
Exemple:

## Funcions pels valors desconeguts

* is.na

### complete.cases

Retorna un vector lògic amb la longitud del nombre d'observacions (files) de la taula de dades i amb al valor és TRUE per les observacions sense valors desconeguts. Aquest vector es pot utilitzar per filtrar les observacions sense valors desconeguts:

### na.omit

Omet les files que contenen valors mancants.

## Funcions estadístiques
### is.na: valor desconegut

Retorna TRUE si l'argument conté un valor desconegut i FALSE si no ho és:

### sd: desviació típica

Estima la desviació típica (o desviació estàndard) d'un conjunt de dades (és a dir, l'arrel quadrada de la seva variància):

## Funcions de probabilitats
### runif

Genera nombres pseudo-aleatoris d'una distribució uniforme en l'interval definit per un mínim i un màxim (per omissió, de 0 a 1). Sintaxis:
    runif(n, min=<valor mínim>, max=<valor màxim>)
on "n" és el nombre de números aleatoris que es volen generar. Exemple:
Cada vegada que es generen nombres pseudo-aleatoris els resultats són diferents, ja que la llavor utilitzada és diferent en cada moment. Perquè els resultats siguin reproduïbles, es pot especificar explícitament la llavor, utilitzant el <codi>set.seed (<nombre>)</codi>, tal com es mostre en l'exemple anterior.

## Funcions per a text
### as.character: Convertir a caràcter

Converteix un tipus de variable en un caràcter:

### is.na: valor desconegut

Retorna TRUE si l'argument conté un valor desconegut i FALSE si no ho és:

### paste: concatenar caràcters i/o variables

Dos valors de tipus caràcters es poden concatenar amb la funció paste:
Si no es vol un espai entre els caràcters es pot utilitzar l'opció sep="":
També amb variables i text. Per exemple, es pot combinar la variable XCAMIF (el camí on estan una sèrie de funcions) i el text des.R (el nom del fitxer on està una una funció):
Això és útil per no tenir, p. ex., que escriure el camí on està el fitxer des.R si aquest s'ha de carregar.

### sub: substituir caràcter

Si en un cap text es te, per exemple, uns punts que es volen treure (i substituir per un espai, " "), és poden fer servir les funcion sub i gsub. La primera substitueix només el primer punt que troba i la segona els substitueix tots. Per exemple, suposem que en una taula de dades tenim el camp NOM amb els noms amb un punt entre nom i cognom i un punt després del cognom:
També es poden eliminar més d'un caràcter. P. ex., si en els noms hi ha un punt i una ensaïmada, es poden substituir els dos a la vegada per un espai:

### substring: Extreure subcaràcters

Extreure o reemplaçar subcadenes d'un caràcter.

## Funcions per directoris i fitxers externs
### file.exists

Per verificar si existeixen directoris i fitxers no R:
Exemples:
És molt útil per crear un directori on es vulgui deixar els resultats, si aquest no existeix:

## Altres tipus de funcions
# Càlcul amb funcions

Anem a calcular la mitja aritmètica:
sum(nom_variable)/length(nom_variable)
Calculem la mitja armònica:
1/sum(1/nom_variable)/length(nom_variable)

# Definició de variables

Asignar una variable Per asignar el valor "24" a la variable "hores" usem la comanda:
hores<-24
També es pot assignar un valor amb el signe "=". La ordre seria:
hores=24
Perquè mostri el valor de la variable "hores":
hores
Igualment amb:
dies<-365 minuts<-60 segons<-60
Per tant si volem que ens faci el producte hem de posar i hem de saber que com que el resultat surt per pantalla no s'emmagatzema enlloc i per tant haurem de tornar a escriure l'ordre per tornar a calcular el resultat:
dies*hores*minuts*segons
c
Si volem assignar els valors 7, 35 i 54 a una variable escriurem:
variable<-c(7,35,54)
Si el que volem és que ens faci una llista de l'1 al 20 ho podem aconseguir fent:
llista<-c(1:20)
Però si ho volem per posar un mateix nombre 7 unes 20 vegades fem:
mateix<-c(rep(7,20))

# Càlculs amb manipulació de variables

Si tenim una variable amb 5 posicions i fem la instrucció:
a<-c(1:5); a+5;
Ens dóna com a resultat el mateix vector però amb un cinc sumat a totes les posicions. Recordem que aquest valor no es guarda sino que simplement s'imprimeix per pantalla.
Si l'elevem al quadrat ens dóna els quadrats de cada posició.
a^2
En definitiva si fem operacions amb una variable que és un vector ens fa tantes operacions com posicions té el vector.

# Matrius

matrix(nom_variable,n_files) Expressa la variable en forma d'una matriu amb les files desitjades.
t Ens fa la transposada d'una funció.
%*% És el simbol per poder multiplicar dues funcions.
solve Ens calcula la matriu inversa d'una altra.

# Programació

IF
if(cond) expr if(cond) cons.expr else alt.expr
FOR
for(var in seq) expr while(cond) expr repeat expr break next
Exemples:
for(i in 1:5) print(1:i)
for(n in c(2,5,10,20,50)) {
f = factor(sample(letters[1:5], 10, replace=TRUE)) for( i in unique(f) ) print(i)
L'ordre system permet executar des de dintre el R una ordre de Linux. Per exemple, per llistar el contingut del directori temporal de l'usuari:

# Referències

* 1 2 Data types, part 1: Ways to store variables
* 1 2 3 Kabacoff RI. R in action, data analysis and graphics with R. Shelter Island, NY: Manning Publications Co; 2011
* 1 2 Roger D. Peng. Computing for Data Analysis.