web-dev-qa-db-fra.com

Comment diviser une trame de données?

Je veux diviser un bloc de données en plusieurs plus petits. Cela semble être une question très triviale, mais je ne parviens pas à trouver une solution à partir de la recherche sur le Web.

66
Leo5188

Vous pouvez également vouloir couper le cadre de données en un nombre arbitraire de petits cadres de données. Ici, nous avons coupé en deux cadres de 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 fractionner un bloc de données en fonction d'une colonne existante. Par exemple, pour créer trois blocs de données basés sur la colonne cyl dans mtcars:

split(mtcars,mtcars$cyl)
56
Greg

Si vous souhaitez fractionner une image de données en fonction des valeurs d'une variable, je vous suggère d'utiliser daply() à partir du package plyr.

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

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

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

Je serais cependant sûr qu'il n'y a pas d'autres moyens plus astucieux de traiter vos données avant de les séparer en plusieurs cadres de données.

19
JoFrhwld

Vous pouvez aussi utiliser

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

Cela créera un cadre de données 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
13
Dimitar Slavchev

Je viens de poster une sorte de RFC qui pourrait vous aider: Fractionner 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

A bientôt, Sebastian

11
Sebastian

subset() est également utile:

subset(DATAFRAME, COLUMNNAME == "")

Pour un paquetage d'enquête, peut-être que le paquetage survey est pertinent?

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

7
apeescape

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

Par exemple, si vous souhaitez omettre certaines variables, vous pouvez créer de nouveaux cadres de données à partir de colonnes spécifiques de la base de données. Les indices entre parenthèses après la trame de données se réfèrent 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 la sélection de lignes contenant une valeur particulière ou de facteurs avec une valeur souhaitée.

Que voulez-vous faire avec les morceaux restants? Avez-vous besoin d'effectuer la même opération sur chaque bloc de la base de données? Ensuite, vous voudrez vous assurer que les sous-ensembles du bloc de données se retrouvent dans un objet pratique, tel qu'une liste, qui vous aidera à exécuter la même commande sur chaque bloc du bloc de données.

4
Ben M

Si vous voulez diviser par des valeurs dans l'une des colonnes, vous pouvez utiliser lapply. Par exemple, pour scinder ChickWeight en un ensemble de données distinct pour chaque poussin:

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

La scission du bloc de données semble contre-productive. Utilisez plutôt 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 uniquement les colonnes pertinentes et appliquez la fonction scale() à x dans chaque groupe, puis combinez les résultats (avec 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 par rapport à la scission de data.frames, et le résultat reste utilisable en analyse 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 scission de trames de données, mais pas aussi rapidement que la scission-application-combinaison.

3
Martin Morgan