InicioManipulaci贸n de datosDividir datos en R

Dividir datos en R

Aprende a dividir datos en R basados en un factor

La funci贸n split permite dividir datos en R bas谩ndose 鈥嬧媏n niveles de factores. En este tutorial mostraremos c贸mo dividir datos en R con diferentes ejemplos y revisaremos todos los argumentos de la funci贸n.

La funci贸n split en R

La funci贸n split divide los datos de entrada (x) en diferentes grupos (f). El siguiente bloque resume los argumentos de la funci贸n y su descripci贸n.

split(x,                 # Vector o data frame
      f,                 # Grupos de clase factor, vector o lista
      drop = FALSE,      # Si eliminar los grupos no usados (TRUE) o no (FALSE)
      sep = ".",         # Cadena de caracteres para separar los grupos cuando f es una lista
      lex.order = FALSE, # Si la concatenaci贸n de factores debe ser ordenada l茅xicamente (TRUE) o no (FALSE)
      ...)               # Argumentos adicionales

Dividir un vector en R

Sup贸n que tienes un vector cuyos elementos tienen asignado un nombre y donde el nombre de cada elemento corresponde al grupo al que pertenece el elemento. Puedes dividir el vector en dos vectores donde los elementos pertenezcan al mismo grupo, pasando los nombres del vector con la funci贸n names al argumento f.

a <- c(x = 3, y = 5, x = 1, x = 4, y = 3)
a
x y x x y
3 5 1 4 3
split(a, f = names(a))
$`x`
x x x
3 1 4

$y
y y
5 3

Tambi茅n puedes pasar un vector de caracteres como par谩metro del argumento f para indicar los grupos correspondientes de cada elemento, o directamente un objeto de tipo factor.

grupos <- c("Grupo 1", "Grupo 1", "Grupo 2", "Grupo 1", "Grupo 2")

split(a, f = grupos)
split(a, f = factor(grupos)) # Equivalente
$`Grupo 1`
x y x
3 5 4

$`Grupo 2`
x y
1 3 

Adem谩s, puedes dividir tus datos en m煤ltiples grupos, generando interacciones entre ellos. Para tal prop贸sito la entrada del argumento f debe ser una lista.

grupos_2 <- c("Tipo 1", "Tipo 1", "Tipo 1", "Tipo 2", "Tipo 1")

split(a, f = list(grupos, grupos_2))


# Equivalent
f1 <- factor(c("Grupo 1", "Grupo 1", "Grupo 2", "Grupo 1", "Grupo 2"),
             levels = c("Grupo 1", "Grupo 2"))
f2 <- factor(c("Tipo 1", "Tipo 1", "Tipo 1", "Tipo 2", "Tipo 1"),
             levels = c("Tipo 1", "Tipo 2"))

split(a, f = list(f1, f2))
$`Grupo 1.Tipo 1`
x y
3 5

$`Grupo 2.Tipo 1`
x y
1 3

$`Grupo 1.Tipo 2`
x
4

$`Grupo 2.Tipo 2`
named numeric(0)

N贸tese que, por defecto, las interacciones entre grupos se separan con un punto y que la salida contiene todos los grupos posibles, incluso cuando no hay observaciones en algunos de ellos. Sin embargo, puedes personalizar esto con los argumentos sep y drop, respectivamente.

vec_split <- split(a, f = list(f1, f2), drop = TRUE, sep = ": ")
vec_split
$`Grupo 1: Tipo 1`
x y
3 5

$`Grupo 2: Tipo 1`
x y
1 3

$`Grupo 1: Tipo 2`
x
4

Cabe mencionar que con la funci贸n unsplit puedes recuperar el vector original, pero los nombres de los elementos se perder谩n.

unsplit(vec_split, list(f1, f2))
<NA> <NA> <NA> <NA> <NA>
 3    5    1    4    3 

Dividir un data frame en R

Puedes dividir un conjunto de datos en subconjuntos en funci贸n de una o m谩s variables que representan grupos de datos. Considera el siguiente data frame:

set.seed(3)

df <- CO2[sample(1:nrow(CO2), 10), ]
head(df)
   Plant        Type  Treatment conc uptake
15   Qn3      Quebec nonchilled   95   16.2
68   Mc1 Mississippi    chilled  500   19.5
32   Qc2      Quebec    chilled  350   38.8
27   Qc1      Quebec    chilled  675   35.4
49   Mn1 Mississippi nonchilled 1000   35.5
48   Mn1 Mississippi nonchilled  675   32.4

Puedes usar la funci贸n split para dividir el data frame en grupos basados, por ejemplo, en la variable Treatment.

split(df, f = df$Treatment)
$`nonchilled`
   Plant        Type  Treatment conc uptake
15   Qn3      Quebec nonchilled   95   16.2
49   Mn1 Mississippi nonchilled 1000   35.5
48   Mn1 Mississippi nonchilled  675   32.4
10   Qn2      Quebec nonchilled  250   37.1
44   Mn1 Mississippi nonchilled  175   19.2

$chilled
   Plant        Type Treatment conc uptake
68   Mc1 Mississippi   chilled  500   19.5
32   Qc2      Quebec   chilled  350   38.8
27   Qc1      Quebec   chilled  675   35.4
23   Qc1      Quebec   chilled  175   24.1
79   Mc3 Mississippi   chilled  175   18.0

Como explicamos en la secci贸n de vectores, puedes dividir un data frame en subconjuntos que cumplan diferentes combinaciones de grupos al mismo tiempo. Por ejemplo, puedes crear la divisi贸n del data frame de muestra con las columnas Type y Treatment. Esto crear谩 cuatro subconjuntos con todas las combinaciones posibles de los grupos. Ten en cuenta que el n煤mero total de divisiones es la multiplicaci贸n del n煤mero de niveles de cada grupo.

dfs <- split(df, f = list(df$Type, df$Treatment))
dfs
$`Quebec.nonchilled`
   Plant   Type  Treatment conc uptake
15   Qn3 Quebec nonchilled   95   16.2
10   Qn2 Quebec nonchilled  250   37.1

$Mississippi.nonchilled
   Plant        Type  Treatment conc uptake
49   Mn1 Mississippi nonchilled 1000   35.5
48   Mn1 Mississippi nonchilled  675   32.4
44   Mn1 Mississippi nonchilled  175   19.2

$Quebec.chilled
   Plant   Type Treatment conc uptake
32   Qc2 Quebec   chilled  350   38.8
27   Qc1 Quebec   chilled  675   35.4
23   Qc1 Quebec   chilled  175   24.1

$Mississippi.chilled
   Plant        Type Treatment conc uptake
68   Mc1 Mississippi   chilled  500   19.5
79   Mc3 Mississippi   chilled  175   18.0

Recuerda que puedes recuperar el data frame original con la funci贸n unsplit, pasando el data frame dividido y el grupo o grupos que utilizaste para crear la divisi贸n.

unsplit(dfs, f = list(df$Type, df$Treatment))