Mostrando entradas con la etiqueta subset. Mostrar todas las entradas
Mostrando entradas con la etiqueta subset. Mostrar todas las entradas

2020-12-08

Cómo combinar múltiples condiciones para filtrar un data frame usando "OR”

Title

Problema

Queremos filtrar un data frame basándonos en múltiples condiciones usando el operador "O". En nuestro ejemplo filtraremos aquellas filas del data frame donde la v1 sea menor que 0.5 o donde v2 sea igual a g.

Data frame original

           v1 v2
1  0.26550866  a
2  0.37212390  b
3  0.57285336  c
4  0.90820779  d
5  0.20168193  e
6  0.89838968  f
7  0.94467527  g
8  0.66079779  h
9  0.62911404  i
10 0.06178627  j

Resultado esperado

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

Solución

Hay múltiples opciones:

  • Funciones del paquete base
  • subset(df , v1 < 0.5 | v2 == "g")
    df[which(df$v1 < 0.5 | df$v2 == "g"), ]
    

  • Operatores [ y [[
  • df[df[1] < 0.5 | df[2] == "g", ] 
    df[df[[1]] < 0.5 | df[[2]] == "g", ] 
    df[df["v1"] < 0.5 | df["v2"] == "g", ]
    

    df$name is equivalent to df[["name", exact = FALSE]]

  • dplyr
  • library(dplyr)
    filter(df, v1 < 0.5 | v2 == "g")
    

  • sqldf
  • library(sqldf)
    sqldf('SELECT *
          FROM df 
          WHERE v1 < 0.5 OR v2 = "g")
    

Referencias

2020-12-07

How to combine multiple conditions to subset a data frame using “OR”?

Title

Problem

We want to subset a data frame based on multiple conditions using "OR". In our example we want to subset the data frame to include all rows where v1 is less than 0.5 or rows where v2 is equal to g.

Original data frame

           v1 v2
1  0.26550866  a
2  0.37212390  b
3  0.57285336  c
4  0.90820779  d
5  0.20168193  e
6  0.89838968  f
7  0.94467527  g
8  0.66079779  h
9  0.62911404  i
10 0.06178627  j

Expected output

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

Solution

There are multiple options:

  • Base functions
  • subset(df , v1 < 0.5 | v2 == "g")
    df[which(df$v1 < 0.5 | df$v2 == "g"), ]
    

  • Operators [ and [[
  • df[df[1] < 0.5 | df[2] == "g", ] 
    df[df[[1]] < 0.5 | df[[2]] == "g", ] 
    df[df["v1"] < 0.5 | df["v2"] == "g", ]
    

    df$name is equivalent to df[["name", exact = FALSE]]

  • dplyr
  • library(dplyr)
    filter(df, v1 < 0.5 | v2 == "g")
    

  • sqldf
  • library(sqldf)
    sqldf('SELECT *
          FROM df 
          WHERE v1 < 0.5 OR v2 = "g")
    

References

2019-10-18

How to subset a contingency table in R?

Problem

We'd like to subset a contingency table. In our example, we use the dataset chickwts, subsetting those types of feed for which we have more than 11 observations.

table(chickwts$feed)
   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12

Solution

  • Base package
  • Using the function subset.

    subset(data.frame(table(chickwts$feed)), Freq > 11)
    
  • dplyr
  • library(dplyr)
    chickwts %>% 
      count(feed) %>%
      filter(n > 11) 
    
    

Results

 # base
      Var1 Freq
1    casein   12
3   linseed   12
5   soybean   14
6 sunflower   12

# dplyr

# A tibble: 4 × 2
       feed     n
      
1    casein    12
2   linseed    12
3   soybean    14
4 sunflower    12

References

2017-05-16

Filtrar una tabla de contingencia en R

Problema

Deseamos filtrar una tabla de contigencia. En nuestro ejemplo con el conjunto de datos chickwts, aquellos que tengan un factor de feed mayor que 11.

table(chickwts$feed)
   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12

Solución

  • Paquete base
  • Utilizando la función subset.

    subset(data.frame(table(chickwts$feed)), Freq > 11)
    
  • dplyr
  • library(dplyr)
    chickwts %>% 
      count(feed) %>%
      filter(n > 11) 
    
    

Resultado

 # base
      Var1 Freq
1    casein   12
3   linseed   12
5   soybean   14
6 sunflower   12

# dplyr

# A tibble: 4 × 2
       feed     n
      
1    casein    12
2   linseed    12
3   soybean    14
4 sunflower    12

Entradas relacionadas

Referencias

2017-02-06

Dividir y guardar como ficheros subconjuntos de un data frame con R


Problema

Queremos guardar cada subconjunto de un data frame como un fichero de texto en el directorio de trabajo. En este ejemplo, utilizamos el conjunto de datos iris y crearemos un fichero CSV por cada una de las especies de la columna Species: setosa, versicolor, y virginica.

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Solución

Utilizamos el siguiente bucle para filtrar el data frame y creas los ficheros.

for (name in levels(iris$Species)) {
  # Filtramos el data frame y seleccionamos las columnas
  tmp <- subset(iris, select = -Species, Species == name)
  # Crea un nuevo fichero por cada especie
  fn <- paste(gsub(" ", "", name), ".csv", sep = "")
  # Por cada especie, guarda un CSV en el directorio de trabajo
  write.csv(tmp, fn, row.names = FALSE)
} 

Resultado

En el directorio de trabajo, se habrán guardo los ficheros correspondientes.

2016-05-11

Muestra aleatoria basada en una columna en R

Title

Problema

Queremos extraer del siguiente data frame una muestra aleatoria basada en la columna id, de manera que seleccionemos aleatoriamente dos ids y extraigamos todas las filas asociadas a los mismos. Por ejemplo, si seleccionamos aleatoriamente los ids 1 y 2, el resultado debería incluir las tres primeras filas.

  id     date      date2
1  1 23-01-08 2008-01-23
2  1 01-11-07 2007-11-01
3  2 30-11-07 2007-11-30
4  3 17-12-07 2007-12-17
5  3 12-12-08 2008-12-12
id<-c(1,1,2,3,3)
date<-c("23-01-08","01-11-07","30-11-07","17-12-07","12-12-08")
df<-data.frame(id,date)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")

Soluciones

  • Paquete base
  • a <- sample(unique(df$id), 2)
    subset(df, id %in% a)
    
  • sqldf
  • library(sqldf)
    a <- sqldf("SELECT DISTINCT id FROM df  ORDER BY RANDOM(*) LIMIT 2")
    sqldf("SELECT * FROM df WHERE id IN a")
    
      id     date      date2
    1  1 23-01-08 2008-01-23
    2  1 01-11-07 2007-11-01
    3  2 30-11-07 2007-11-30
    

    Entradas relacionadas

    Referencias

    Nube de datos