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.
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)
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.
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
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
subset()
est également utile:
subset(DATAFRAME, COLUMNNAME == "")
Pour un paquetage d'enquête, peut-être que le paquetage survey
est pertinent?
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.
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,])
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.