[Rstudio] Affectation de table à Variable dans une boucle FOR
Bonjour !
Je suis confronté à un problème aujourd'hui qui m'a l'air pourtant pas bien compliqué à résoudre.
dans l'idée il me faut créer des tables pour chaque modalités de la colonne "data$colonne"
Code:
1 2 3 4 5 6 7 8
|
table_var1 <- subset(data, data$colonne == "var1")
table_var2 <- subset(data, data$colonne == "var2")
table_var3 <- subset(data, data$colonne == "var3")
write.table(table_var1, ...)
write.table(table_var2, ...)
write.table(table_var3, ...) |
Ce que je cherche à faire ici et de pouvoir implémenter ce code dans une boucle car il y aura des colonnes avec bien plus de modalités.
C'est pourquoi j'ai créé ce code qui n'est pas encore fonctionnel.
Code:
1 2 3 4
|
for (i in as.character(unique(data$colonne))){
i <- subset(data, data$colonne == i)
} |
Output (réel) = une table nommée i
Output (voulu) = 3 tables nommées var1, var2, var3,
Quelqu'un aurait-il des pistes à explorer ?
En vous remerciant d'avance.
Mano
Diviser un dataframe en fonction d'une variable
Bonjour,
Il ne faut pas raisonner en boucles dans R.
Une proposition :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| > airquality.month <- split(airquality, airquality$Month)
> str(airquality.month)
List of 5
$ 5:'data.frame': 31 obs. of 6 variables:
..$ Ozone : int [1:31] 41 36 12 18 NA 28 23 19 8 NA ...
..$ Solar.R: int [1:31] 190 118 149 313 NA NA 299 99 19 194 ...
..$ Wind : num [1:31] 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
..$ Temp : int [1:31] 67 72 74 62 56 66 65 59 61 69 ...
..$ Month : int [1:31] 5 5 5 5 5 5 5 5 5 5 ...
..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...
$ 6:'data.frame': 30 obs. of 6 variables:
..$ Ozone : int [1:30] NA NA NA NA NA NA 29 NA 71 39 ...
..$ Solar.R: int [1:30] 286 287 242 186 220 264 127 273 291 323 ...
..$ Wind : num [1:30] 8.6 9.7 16.1 9.2 8.6 14.3 9.7 6.9 13.8 11.5 ...
..$ Temp : int [1:30] 78 74 67 84 85 79 82 87 90 87 ...
..$ Month : int [1:30] 6 6 6 6 6 6 6 6 6 6 ...
..$ Day : int [1:30] 1 2 3 4 5 6 7 8 9 10 ...
$ 7:'data.frame': 31 obs. of 6 variables:
..$ Ozone : int [1:31] 135 49 32 NA 64 40 77 97 97 85 ...
..$ Solar.R: int [1:31] 269 248 236 101 175 314 276 267 272 175 ...
..$ Wind : num [1:31] 4.1 9.2 9.2 10.9 4.6 10.9 5.1 6.3 5.7 7.4 ...
..$ Temp : int [1:31] 84 85 81 84 83 83 88 92 92 89 ...
..$ Month : int [1:31] 7 7 7 7 7 7 7 7 7 7 ...
..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...
$ 8:'data.frame': 31 obs. of 6 variables:
..$ Ozone : int [1:31] 39 9 16 78 35 66 122 89 110 NA ...
..$ Solar.R: int [1:31] 83 24 77 NA NA NA 255 229 207 222 ...
..$ Wind : num [1:31] 6.9 13.8 7.4 6.9 7.4 4.6 4 10.3 8 8.6 ...
..$ Temp : int [1:31] 81 81 82 86 85 87 89 90 90 92 ...
..$ Month : int [1:31] 8 8 8 8 8 8 8 8 8 8 ...
..$ Day : int [1:31] 1 2 3 4 5 6 7 8 9 10 ...
$ 9:'data.frame': 30 obs. of 6 variables:
..$ Ozone : int [1:30] 96 78 73 91 47 32 20 23 21 24 ...
..$ Solar.R: int [1:30] 167 197 183 189 95 92 252 220 230 259 ...
..$ Wind : num [1:30] 6.9 5.1 2.8 4.6 7.4 15.5 10.9 10.3 10.9 9.7 ...
..$ Temp : int [1:30] 91 92 93 93 87 84 80 78 75 73 ...
..$ Month : int [1:30] 9 9 9 9 9 9 9 9 9 9 ...
..$ Day : int [1:30] 1 2 3 4 5 6 7 8 9 10 ... |
Code:
1 2 3 4 5 6 7 8
| > head(airquality.month$'5')
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6 |
Cordialement,
Exporter un dataframe en fonction d'une variable
Code:
1 2 3 4
| require(data.table)
airquality <- airquality # pour pouvoir modifier la table compilée
setDT(airquality) # conversion de la table en data.table
airquality[, write.csv2(.SD, paste0("airquality_month", .BY, ".csv"), row.names = FALSE), by = Month] |
Génère un message Empty data.table (0 rows) of 1 col: Month mais les fichiers semblent bien exportés.
(Code trouvé ici).
Cordialement,
Exporter un dataframe en fonction d'une variable
Citation:
Code:
1 2 3 4
| require(data.table)
airquality <- airquality # pour pouvoir modifier la table compilée
setDT(airquality) # conversion de la table en data.table
airquality[, write.csv2(.SD, paste0("airquality_month", .BY, ".csv"), row.names = FALSE), by = Month] |
Cela génère bien un csv dans mon répertoire sauf qu'il y a toutes les données et elle ne sont pas séparé dans 3 fichier csv distincts.
Bizarre, j'obtiens bien 5 fichiers avec ce code...
Pour la méthode avec le package dplyr, il faut adapter la fonction à votre table :
Avec la table mtcars :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| > customFun = function(DF){
+ write.csv(DF,paste0("mtcars_cyl_",unique(DF$cyl),".csv"))
+ return(DF)
+ }
>
> library(dplyr)
> mtcars %>%
+ group_by(cyl) %>%
+ do(customFun(.))
# A tibble: 32 x 11
# Groups: cyl [3]
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
2 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
3 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
4 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
5 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
6 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
7 21.5 4 120. 97 3.7 2.46 20.0 1 0 3 1
8 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
9 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
10 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
# ... with 22 more rows |
Avec la table airquality :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| > customFun = function(DF){
+ write.csv(DF,paste0("airquality_month", unique(DF$Month), ".csv"))
+ return(DF)
+ }
>
> library(dplyr)
> airquality %>%
+ group_by(Month) %>%
+ do(customFun(.))
# A tibble: 153 x 6
# Groups: Month [5]
Ozone Solar.R Wind Temp Month Day
<int> <int> <dbl> <int> <int> <int>
1 41 190 7.4 67 5 1
2 36 118 8 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
# ... with 143 more rows |
Ou sans fonction :
Avec la table mtcars :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| > library(dplyr)
> library(readr)
> group_by(mtcars, cyl) %>%
+ do(write_csv(., paste0(unique(.$cyl), "test.csv")))
# A tibble: 32 x 11
# Groups: cyl [3]
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
2 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
3 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
4 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
5 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
6 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
7 21.5 4 120. 97 3.7 2.46 20.0 1 0 3 1
8 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
9 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
10 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
# ... with 22 more rows |
Avec la table airquality :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| > library(dplyr)
> library(readr)
> group_by(airquality, Month) %>%
+ do(write_csv(., paste0("airquality_month", unique(.$Month), ".csv")))
# A tibble: 153 x 6
# Groups: Month [5]
Ozone Solar.R Wind Temp Month Day
<int> <int> <dbl> <int> <int> <int>
1 41 190 7.4 67 5 1
2 36 118 8 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
# ... with 143 more rows |
Cordialement,