Come dividere un frame di dati?

Voglio dividere un frame di dati in diversi più piccoli. Sembra una domanda molto banale, tuttavia non riesco a trovare una soluzione dalla ricerca web.

Si potrebbe anche voler tagliare il frame di dati in un numero arbitrario di dataframer più piccoli. Qui, abbiamo tagliato due dataframe.

 x = data.frame(num = 1:26, let = letters, LET = LETTERS) set.seed(10) split(x, sample(rep(1:2, 13))) 

 $`1` num let LET 3 3 c C 6 6 f F 10 10 j J 12 12 l L 14 14 n N 15 15 o O 17 17 q Q 18 18 r R 20 20 t T 21 21 u U 22 22 v V 23 23 w W 26 26 z Z $`2` num let LET 1 1 a A 2 2 b B 4 4 d D 5 5 e E 7 7 g G 8 8 h H 9 9 i I 11 11 k K 13 13 m M 16 16 p P 19 19 s S 24 24 x X 25 25 y Y 

È anche ansible dividere un frame di dati in base a una colonna esistente. Ad esempio, per creare tre frame di dati basati sulla colonna cyl in mtcars :

 split(mtcars,mtcars$cyl) 

Se vuoi dividere un dataframe in base ai valori di alcune variabili, ti suggerisco di usare daply() dal pacchetto plyr .

 library(plyr) x <- daply(df, .(splitting_variable), function(x)return(x)) 

Ora, x è una matrice di dataframes. Per accedere a uno dei dataframes, è ansible indicizzarlo con il nome del livello della variabile di suddivisione.

 x$Level1 #or x[["Level1"]] 

Sarei sicuro che non ci siano altri modi più intelligenti per gestire i tuoi dati prima di suddividerli in molti dataframes.

Ho appena pubblicato una specie di RFC che potrebbe aiutarti: dividere un vettore in blocchi in R

 x = data.frame(num = 1:26, let = letters, LET = LETTERS) ## number of chunks n <- 2 dfchunk <- split(x, factor(sort(rank(row.names(x))%%n))) dfchunk $`0` num let LET 1 1 a A 2 2 b B 3 3 c C 4 4 d D 5 5 e E 6 6 f F 7 7 g G 8 8 h H 9 9 i I 10 10 j J 11 11 k K 12 12 l L 13 13 m M $`1` num let LET 14 14 n N 15 15 o O 16 16 p P 17 17 q Q 18 18 r R 19 19 s S 20 20 t T 21 21 u U 22 22 v V 23 23 w W 24 24 x X 25 25 y Y 26 26 z Z 

Saluti, Sebastian

Puoi anche usare

 data2 <- data[data$sum_points == 2500, ] 

Questo farà un dataframe con i valori dove sum_points = 2500

Dà :

 airfoils sum_points field_points init_t contour_t field_t ... 491 5 2500 5625 0.000086 0.004272 6.321774 498 5 2500 5625 0.000087 0.004507 6.325083 504 5 2500 5625 0.000088 0.004370 6.336034 603 5 250 10000 0.000072 0.000525 1.111278 577 5 250 10000 0.000104 0.000559 1.111431 587 5 250 10000 0.000072 0.000528 1.111524 606 5 250 10000 0.000079 0.000538 1.111685 .... > data2 <- data[data$sum_points == 2500, ] > data2 airfoils sum_points field_points init_t contour_t field_t 108 5 2500 625 0.000082 0.004329 0.733109 106 5 2500 625 0.000102 0.004564 0.733243 117 5 2500 625 0.000087 0.004321 0.733274 112 5 2500 625 0.000081 0.004428 0.733587 

subset() è anche utile:

 subset(DATAFRAME, COLUMNNAME == "") 

Per un pacchetto di sondaggi, forse il pacchetto di survey è pertinente?

http://faculty.washington.edu/tlumley/survey/

La risposta che vuoi dipende molto da come e perché vuoi rompere il frame dei dati.

Ad esempio, se si desidera escludere alcune variabili, è ansible creare nuovi frame di dati da colonne specifiche del database. Gli indici tra parentesi dopo la cornice dati si riferiscono ai numeri di riga e colonna. Scopri Spoetry per una descrizione completa.

 newdf <- mydf[,1:3] 

Oppure puoi scegliere righe specifiche.

 newdf <- mydf[1:3,] 

E questi pedici possono anche essere test logici, come la scelta di righe che contengono un particolare valore o fattori con un valore desiderato.

Cosa vuoi fare con i pezzi rimasti? Hai bisogno di eseguire la stessa operazione su ogni blocco del database? Quindi dovrai assicurarti che i sottoinsiemi del frame di dati finiscano in un object conveniente, come un elenco, che ti aiuterà a eseguire lo stesso comando su ogni blocco del frame di dati.

Se vuoi dividere per valori in una delle colonne, puoi usare lapply . Ad esempio, per dividere ChickWeight in un set di dati separato per ogni pulcino:

 data(ChickWeight) lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,]) 

La divisione del frame dei dati sembra controproducente. Invece, usa il paradigma split-apply-combine, ad esempio genera alcuni dati

 df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100)) 

quindi dividi solo le colonne pertinenti e applica la funzione scale() a x in ogni gruppo e combina i risultati (usando split<- o ave )

 df$z = 0 split(df$z, df$grp) = lapply(split(df$x, df$grp), scale) ## alternative: df$z = ave(df$x, df$grp, FUN=scale) 

Questo sarà molto veloce rispetto alla suddivisione di data.frames, e il risultato rimane utilizzabile nell'analisi a valle senza iterazione. Penso che la syntax di dplyr sia

 library(dplyr) df %>% group_by(grp) %>% mutate(z=scale(x)) 

In generale, questa soluzione di dplyr è più veloce della divisione di frame di dati ma non veloce come split-apply-combine.