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

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-02-10

Seleccionar con sqldf un subconjunto de filas de una columna en un data frame diferente

Title

Problema

Supongamos que tenemos los siguientes data frames.

#A
  a1  a2
1  1 101
2  2 102
3  3 103
4  4 104
#B
  a1  a2
1  1 101
2  2 102
3  3 103
4  4 104
A <-  data.frame(a1 = c(1:4), a2 = c(101:104))
B <-  data.frame(b1 = c(1:2), b2 = c(55,56))
Deseamos obtener el siguiente subconjunto de filas del data frame A, en el que la columna A$a1 contenga los elementos de la columna B%b1 del data frame B. Pero en lugar del paquete base, como hacemos a continuación, queremos emplear el paquete sqldf.

A[A$a1 %in% B$b1, ]

 a1  a2
1  1 101
2  2 102

Solución

Usamos la función paste dos veces. Para concatenar los elementos del vector B$b1 separado por comas, y después para concatenar la cadena de texto deseada: [1] "select * from A where a1 in( 1,2 )"

library(sqldf)
sqldf(paste("select * from A where a1 in(", paste(B$b1, collapse = ","), ")"))
Otras dos alternativas propuestas por G. Grothendieck son:

# 1
fn$sqldf(" select * from A where a1 in ( `toString(B$b1)` ) ") 
# 2
sqldf("select A.* from A join B on A.a1 = B.b1")

Resultado

 a1  a2
1  1 101
2  2 102

Referencias

Nube de datos