Comment diviser un bloc de données?

Je veux diviser un bloc de données en plusieurs plus petits. Cela ressemble à une question très sortingviale, mais je ne trouve pas de solution à partir de la recherche sur le Web.

Vous pouvez également vouloir couper le bloc de données en un nombre arbitraire de plus petites structures de données. Ici, nous découpons en deux données.

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

donne

 $`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 

Vous pouvez également diviser un bloc de données en fonction d’une colonne existante. Par exemple, pour créer trois trames de données basées sur la colonne cyl dans mtcars :

 split(mtcars,mtcars$cyl) 

Si vous voulez diviser un dataframe en fonction des valeurs d’une variable, je vous suggère d’utiliser daply() partir du paquet plyr .

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

Maintenant, x est un tableau de données. Pour accéder à l'un des schémas de données, vous pouvez l'indexer avec le nom du niveau de la variable de fractionnement.

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

Je suis sûr qu'il n'y a pas d'autres façons plus intelligentes de traiter vos données avant de les diviser en plusieurs dataframes.

Je viens de poster une sorte de RFC qui pourrait vous aider: Diviser un vecteur en morceaux dans 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 

Bravo, Sebastian

Vous pouvez aussi utiliser

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

Cela fera un dataframe avec les valeurs où sum_points = 2500

Il donne :

 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() est également utile:

 subset(DATAFRAME, COLUMNNAME == "") 

Pour une trousse d’enquête, la trousse d’ survey est peut-être pertinente?

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

La réponse que vous souhaitez dépend beaucoup de la manière et de la raison pour laquelle vous souhaitez diviser le bloc de données.

Par exemple, si vous souhaitez exclure certaines variables, vous pouvez créer de nouveaux blocs de données à partir de colonnes spécifiques de la firebase database. Les indices entre parenthèses après le bloc de données font référence aux numéros de ligne et de colonne. Découvrez Spoetry pour une description complète.

 newdf < - mydf[,1:3] 

Ou, vous pouvez choisir des lignes spécifiques.

 newdf < - mydf[1:3,] 

Et ces indices peuvent également être des tests logiques, tels que le choix de lignes contenant une valeur particulière ou des facteurs avec une valeur souhaitée.

Qu'est-ce que vous voulez faire avec les morceaux restants? Devez-vous effectuer la même opération sur chaque partie de la firebase database? Ensuite, vous voudrez vous assurer que les sous-ensembles du bloc de données se retrouvent dans un object pratique, tel qu'une liste, qui vous aidera à exécuter la même commande sur chaque bloc du bloc de données.

Si vous souhaitez diviser par des valeurs dans l’une des colonnes, vous pouvez utiliser lapply . Par exemple, pour séparer ChickWeight en un dataset distinct pour chaque poussin:

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

Le fractionnement du bloc de données semble contre-productif. Au lieu de cela, utilisez le paradigme split-apply-combine, par exemple, générer des données

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

puis divisez seulement les colonnes pertinentes et appliquez la fonction scale() à x dans chaque groupe et combinez les résultats (en utilisant split< - ou 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) 

Ce sera très rapide comparé au fractionnement de data.frames, et le résultat rest utilisable dans une parsing en aval sans itération. Je pense que la syntaxe dplyr est

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

En général, cette solution dplyr est plus rapide que la division des trames de données, mais moins rapide que la méthode split-apply-combine.