DataFrame R
DataFrame R
Las dos formas ms comunes de obtener un data frame es por medio de la funcin
data.frame() y al leer un archivo de texto con la funcin read.table().
En el ejemplo siguiente se crea una tabla de datos a partir de vectores y factores
previamente definidos.
Ejemplo 1
# Se crea el vector edad por medio de la funcin c().
EDAD<-c(12,15,17,10,45)
# Se crea el vector CASO por medio de la funcin seq()
CASO<- seq(1,5)
# Se crea el factor SEXO por medio de la funcin rep().
SEXO<-rep(x=c("M","H"),times=c(2,3))
# Creamos el data frame por medio de la funcin data.frame().
1|Pgina
df<-data.frame(edad=EDAD,caso=CASO,sexo=SEXO)
df
##
##
##
##
##
##
1
2
3
4
5
Ejemplo 2
resultados <- data.frame(
talla = c(185,172,165,177,168),
peso = c( 82, 70, 76, 52, 72),
QI
= c(110,120, 92,120,142),
sexo = c("H","M","M", "M","H"),
row.names= c("Pablo", "Marta","Lola","Genoveva
", "Luis"))
resultados
##
##
##
##
##
##
Pablo
Marta
Lola
Genoveva
Luis
Como lista
Para trabajar con las variables (columnas) de un data.frame se puede utilizar la
notacin estndar de las listas,
2|Pgina
nombre_data_frame$nombre_columna
nombre_data_frame[[ ]]
Las dos formas son equivalentes en el sentido que muestran la misma informacin.
Sin embargo, no se obtiene el mismo objeto.
Ejemplo 3
df[3]
##
##
##
##
##
##
1
2
3
4
5
sexo
M
M
H
H
H
dim(df[3])
## [1] 5 1
dim(df$sexo)
## NULL
1.7570471
detach(df)
IMPORTANTE Una vez vinculado un data frame por medio de la funcin attach()
las modificaciones hechas a las columnas por medio de las referencia de sus
nombres no afectan al data frame original. A efectos prcticos, al ejecutar
attach(df), R realiza una copia del data frame 'df' y es en esta copia donde se
trabaja.
Por ejemplo, si se ejecuta
3|Pgina
attach(df)
edad <- 2*edad
edad
## [1] 24 30 34 20 90
detach(df)
df$edad
## [1] 12 15 17 10 45
Ejemplo 5
df.2 <- subset(df,edad>14,select=c(edad,sexo))
df.2
##
edad sexo
## 2
15
M
## 3
17
H
## 5
45
H
La funcin transform
Para transformar unas determinadas columnas, o crear nuevas variables, se puede
utilizar la funcin transform(). Su sintaxis es,
transform(data.frame,variable1=f(varibles),variable3=f(varibles)...)
Ejemplo 6
En este ejemplo se transforma la variable edad y el resultado se almacena en un
nuevo data.frame llamado, 'fd.3'.
df.3 <- transform(df,edad=edad*2)
df.3
4|Pgina
##
##
##
##
##
##
1
2
3
4
5
Para realizar la misma operacin sin la funcin transform() bastara con escribir
df$edad <-
df$edad*2
1
2
3
4
5
Sin transform().
1.
2.
3.
df
##
##
##
##
##
##
1
2
3
4
5
5|Pgina
x
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10 10
y
0.5643674
-2.0934608
-1.0279501
1.9950154
-1.7604075
1.0423324
1.1142123
-0.7987946
-0.9349291
-0.4061025
1.9950154 -1.7604075
1.0423
1
2
3
4
5
x
1
2
3
4
5
y
-1.08765510
-1.26294471
-1.67139155
-0.70881465
0.44262326
6|Pgina
##
##
##
##
##
6
6 -1.55626520
7
7 1.06087149
8
8 0.04690693
9
9 -0.43802659
10 10 -0.07292457
misdatos[, -1]
##
##
misdatos
##
##
##
##
##
##
##
##
##
##
##
x
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10 10
y
-1.08765510
-1.26294471
-1.67139155
-0.70881465
0.44262326
-1.55626520
1.06087149
0.04690693
-0.43802659
-0.07292457
1
2
3
4
5
6
7
8
9
10
y
-1.08765510
-1.26294471
-1.67139155
-0.70881465
0.44262326
-1.55626520
1.06087149
0.04690693
-0.43802659
-0.07292457
Los efectos de los dos mtodos no son exactamente iguales. Estudia las diferencias.
Sintaxis
7|Pgina
Argumentos
...
Una secuencia de vectores numricos, complejos, de caracter o
lgicos todos de igual longitud o un objeto de clase R.x Un vector.
partial
Vector de ndices para una ordenacin parcial. (Los valores nulos no
se utilizan)
decreasing
Logica. Determina si el orden es creciente o decreciente.
na.last
Controla el tratamiento de los NAs. Si es TRUE, los valores missing
se colocan al final de los datos, si es FALSE, se colocan al principio de
los datos, si NA, se eliminan de los da-tos.
method
El mtodo que se empleara. Los emparejamientos parciales est?n
permitidos.
Detalles
En el caso de empates en el primer vector, se utilizarn los valores del segundo
vector para deshacer los empates. Si permanece el empate, los valores de los
siguientes argumentos se utilizaran para romper el empate. El tipo de ordenacin
(sort) empleado es "stable" salvo para el mtodo "quick" ( method = "quick"), si
quedar? algun empate sin resolver se dejaran en el su orden original.
Los nmeros complejos se ordenan primero segn su parte real y luego por la
parte imaginaria. El orden de los vectores car?cter depender? de la secuencia local:
ver comparison.
El mtodo por defecto para sort.list es un compromiso. El mtodo "quick" se utiliza
nicamente para valores numricos con la opcin na.last=NA, y no es estable, sin
embargo es el ms rpido en vectores grandes. El metodo "radix" esta nicamente
implementado para valores enteros menores de 100.000. En esta situacin, es
(muy) y estable. Es el mtodo de eleccin para ordenar factores.
El mtodo partial se mantiene para permitir la compatibilidad de otras
implementaciones de S, pero no permite otros valores y la ordenacin ser
siempre completa.
Ejemplos
# La funcin order() da como resultado los ndices de ordenacin.
# La funcin sort() da como resultado el objeto ordenado
# Vector caracter
c1 <- c("A","B","C","D")
sort(c1,decreasing = TRUE)
## [1] "D" "C" "B" "A"
order(c1)
8|Pgina
## [1] 1 2 3 4
c2 <- c("A","D","C","B")
sort(c2,decreasing = TRUE)
## [1] "D" "C" "B" "A"
order(c2)
## [1] 1 4 3 2
# Vector numrico
x <- c(2,1:9)
x_sort <- sort(x)
x
##
[1] 2 1 2 3 4 5 6 7 8 9
[1]
9 10
x[indice]
##
[1] 1 2 2 3 4 5 6 7 8 9
x_sort
##
[1] 1 2 2 3 4 5 6 7 8 9
# Ordenar un data.frame
df1 <- data.frame(
pais = c("M","G","J","L","Z","B"),
pob = c(234, 456, 267,987,123,369),
area = c(1,2,3,2,3,1))
df2 <- df1[order(df1$pais),]
df3 <- df1[order(df1$pob),]
df4 <- df1[order(df1$area),]
# funcin xtfrm() es una funcin auxiliar que produce un vector numri
co que puede ser ordenado en el mismo orden que 'x'.
df5 <- df1[order(-df1$area, -xtfrm(df1$pais)),]
df5
##
##
##
##
##
##
##
5
3
4
2
1
6
pais
Z
J
L
G
M
B
pob area
123
3
267
3
987
2
456
2
234
1
369
1
9|Pgina
b x y
1 Hi A 8
2 Med D 3
3 Hi A 9
4 Low C 9
z
1
1
1
2
dd[with(dd, order(b,-z)), ]
##
##
##
##
##
b x y z
4 Low C 9 2
2 Med D 3 1
1 Hi A 8 1
3 Hi A 9 1
Argumentos
x, y
by, by.x, by.y
all
all.x
all.y
sort
especificadas en by .
suffixes
caracter(2) especifica los sufijos que se utilizaran para crear
nombres cuando los nombres especificados en by names() no
sean ?nicos.
incomparables Valores que no pueden ser emparejados. Ver match.
...
Argumentos que son pasados a o de mtodos.
Detalles
Por defecto los data frames se combinan en funcin de las columnas que en los dos
data frame tienen nombres comunes, pero se puede especificar las columnas que
se quiere utilizar por medio de by.x y by.y, lo que permite realizar la uni?n sin que
en los dos data frame se utilizan los mismos nombres de columna.
Las columnas pueden especificarse por nombre, n?mero o por medio de un vector
lgico, llamado row.names .El n?mero 0 especifica la fila de nombres. Las filas en
los dos data frame que van a emparejarse son extra?das y juntadas. Si hay m?s de
un posible emparejamiento, se realizan tantos emparejamientos como sea posible
y cada uno de ellos genera una nueva fila. El significado preciso de 'match', se
puede ver en match.
Si by o by.x y by.y tiene longitud 0 (un vector de longitud cero o NULL), el
resultado, r, es el producto cartesiano de x e y, es decir, dim(r) =
c(nrow(x)*nrow(y), ncol(x) + ncol(y)).
Si all.x es TRUE, todos los casos no emparejados de x se a?aden al resultado,
a?adiendo NA en las columnas correspondientes de y; de igual forma para all.y.
Si le resto de columnas en los data frames tuviesen nombres iguales se les a?adir?a
como sufijo (".x" and ".y" por defecto) para conseguir que no haya repetici?n de
nombres.
Valor
Un data frame. Las filas se ordenan por defecto segn el orden lexicogrfico entre
las columnas comunes, pero si la opcin sort = FALSE se ordenaran en un orden
no especificado. Primero las columnas que son comunes, seguidas de las columnas
de x e y. Si en el emparejamiento se han especificado los nombres de las filas, se
a?ade una columna extra (car?cter) a la izquierda que se llama row.names.
Ejemplos
## use character columns of names to get sensible sort order
authors <- data.frame(
surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil"))
,
nationality = c("US", "Australia", "US", "UK", "Australia"),
deceased = c("yes", rep("no", 4)))
11 | P g i n a
##
##
##
##
##
##
name
title
other.author
1
Tukey
Exploratory Data Analysis
<NA>
2 Venables Modern Applied Statistics ...
Ripley
3 Tierney
LISP-STAT
<NA>
4
Ripley
Spatial Statistics
<NA>
5
Ripley
Stochastic Simulation
<NA>
6
McNeil
Interactive Data Analysis
<NA>
7
R Core
An Introduction to R Venables & Smith
Lo data frame 'authors' y 'books' tiene en comn la informacin del apellido del
autor de la obra. Sin embargo, en 'authors' esta variable se llama 'surname' y en
'book' 'name'.
Para unir estos dos data frame utilizaremos como campo clave esta variable. Por
medio de > by.x ??? se especifica el nombre de la variable en el primer data frame
(authors) > by.y ??? se especifica el nombre de la variable en el segundo data frame
(books)
(m1 <- merge(authors, books, by.x = "surname", by.y = "name"))
##
surname nationality deceased
.author
## 1
McNeil
Australia
no
<NA>
## 2
Ripley
UK
no
<NA>
## 3
Ripley
UK
no
<NA>
## 4 Tierney
US
no
<NA>
## 5
Tukey
US
yes
title other
Interactive Data Analysis
Spatial Statistics
Stochastic Simulation
LISP-STAT
Exploratory Data Analysis
12 | P g i n a
<NA>
## 6 Venables
Ripley
Australia
Primero aparecen las columnas (variables) del data frame 'authors' seguidos de las
columnas del data frame 'books' indexados por la variable apellidos y en este caso
se mantiene el nombre de 'authors' (del primer data frame) para la columna
com?n.
(m2 <- merge(books, authors, by.x = "name", by.y = "surname"))
##
name
title other.author nationality d
eceased
## 1
McNeil
Interactive Data Analysis
<NA>
Australia
no
## 2
Ripley
Spatial Statistics
<NA>
UK
no
## 3
Ripley
Stochastic Simulation
<NA>
UK
no
## 4 Tierney
LISP-STAT
<NA>
US
no
## 5
Tukey
Exploratory Data Analysis
<NA>
US
yes
## 6 Venables Modern Applied Statistics ...
Ripley
Australia
no
Primero aparecen las columnas (variables) del data frame 'books' seguidos de los
del data frame 'authors' indexados por la variable apellidos y en este caso se
mantiene el nombre de 'books' para la columna com?n.
EERRROR
stopifnot(as.character(m1[,1]) == as.character(m2[,1]),
all.equal(m1[, -1], m2[, -1][ names(m1)[-1] ]),
dim(merge(m1, m2, by = integer(0))) == c(36, 10))
## "R core" is missing from authors and appears only here :
merge(authors, books, by.x = "surname", by.y = "name", all = TRUE)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
13 | P g i n a
1
2
3
4
5
6
14 | P g i n a