2011-08-13 10 views
5

¿Cómo puedo seleccionar n número de subconjuntos de un marco de datos tomando cada enésima fila para subconjunto 1 y luego nth +1 fila para el subconjunto 2 y luego nth + 3 para subset3 hasta enésimo = nSeleccione varios subconjuntos tomando diferentes intervalos de fila y función appy para todos los subconjuntos

he utilizado

subset<-data[seq(nth,length,n),] 

Pero esto da un subconjunto entonces tengo que seguir cambiando de orden n de 1 ... n para obtener diferentes subsets.eg usando una pequeña de datos (106 filas x 742 columnas) configurado para obtener 10 subconjuntos de cada 10ª fila

subset1<-data[seq(1,106,10),] 
subset2<-data[seq(2,106,10),] 
subset3<-data[seq(3,106,10),] 

¿Hay alguna manera de hacerlo mejor?

de pasar por el FAQ He intentado usar bucles como

sub<-function(data,nth,length,n){ 
     sub<-data[seq(nth,length,n),] 
     for(n in 1:(sub)){ 
     sub2<-sub[nth,]+1,sub3<-sub[nth,]+2,sub4<-sub[nth,]+3) } 
     su<-(sub,sub2, sub3,sub4) 
    return(su) 
    } 
sub(data=gag11p,n=1,length=106,10) 

Esto devuelve la lista 3 de datos con sólo la última variable en la trama de datos, no estoy seguro de que hice mal, también cómo puedo acaba de obtener el nombre de el subconjunto en lugar de una trama de datos que quiera aplicar una función de calibración PLS a los subconjuntos creados

Por favor, perdona y corregir cualquier error, ya que estoy aprendiendo ahora la programación y R.

Respuesta

2

I sugerencia t almacena todos estos subconjuntos diferentes en un único objeto list. No estoy seguro de que el 100% seguido de su código anterior, pero creo que esto hace lo que quiere:

FOO <- function(data, nSubsets, nSkip){ 
    outList <- vector("list", length = nSubsets) 
    totRow <- nrow(data) 

    for (i in seq_len(nSubsets)) { 
    rowsToGrab <- seq(i, totRow, nSkip) 
    outList[[i]] <- data[rowsToGrab ,] 
    } 
    return(outList) 
} 

¿Qué está pasando?

  1. En primer lugar, asignar previamente un objeto de lista que se corresponde con el número de subconjuntos desea hacer
  2. Definir el número total de filas por lo que no tiene que pasarlo como parámetro a la función
  3. Utilice un bucle for similar al que utilizó para determinar qué filas tomar y luego defínalo a la lista definida anteriormente
  4. Devuelva el objeto list.

Aquí hay un ejemplo con los datos de mtcars. Tenga en cuenta el conjunto de datos solo de 32 filas, por lo que la función se encarga de automatizar subíndices que están fuera de los límites y no lanza una advertencia/error:

foo (mtcars, 5, 15)

[[1]] 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 #row 1 
Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4 #row 16 
Maserati Bora  15.0 8 301 335 3.54 3.570 14.60 0 1 5 8 #row 31 

[[2]] 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 #row 2 
Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4 #row 17 
Volvo 142E  21.4 4 121 109 4.11 2.780 18.60 1 1 4 2 #row 32 

[[3]] 
      mpg cyl disp hp drat wt qsec vs am gear carb 
Datsun 710 22.8 4 108.0 93 3.85 2.32 18.61 1 1 4 1 #row 3 
Fiat 128 32.4 4 78.7 66 4.08 2.20 19.47 1 1 4 1 #row 18 

[[4]] 
       mpg cyl disp hp drat wt qsec vs am gear carb 
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 #row 4 
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2 #row 19 

[[5]] 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 #row 5 
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 #row 20 
+0

Muchas gracias, funciona y gracias por la explicación que pude seguir fácilmente. – DinoSingh

3

Uno liner usando lapply tomando prestada la idea de función de @Chase.

foo2 = function(data, nSubsets, nSkip){ 
    lapply(1:nSubsets, function(n) data[seq(n, NROW(data), by = nSkip),]) 
} 

foo2(mtcars, 5, 15) 
+0

Muchas gracias por el código más corto. – DinoSingh

+0

Esto es similar a lo que quiero hacer ... seleccionando cada 12ª línea de un conjunto de datos muy grande. Cuando ejecuto la función y el código, la salida en la consola se ve bien, entonces cuando lo llamo un nuevo nombre de fama de datos (es decir, df2 <- foo2 (mtcars, 1, 15) en su ejemplo, me sale un tiempo muy extraño ' lista '. ¿Cómo podría rectificar esto? Muchas gracias @Ramnath –

Cuestiones relacionadas