5 votes

boucler R plusieurs échantillons à partir d'un seul ensemble de données

J'essaie de créer une boucle simple dans R, où j'ai un grand ensemble de données et je veux créer plusieurs échantillons plus petits à partir de cet ensemble de données et les exporter vers Excel :

Je pensais que cela fonctionnerait ainsi, mais ce n'est pas le cas :

 idorg <- c(1,2,3,4,5)
 x <- c(14,20,21,16,17)
 y <- c(31,21,20,50,13)
 dataset <- cbind (idorg,x,y)

 for (i in 1:4)
 {
 attempt[i] <- dataset[sample(1:nrow(dataset), 3, replace=FALSE),]
 write.table(attempt[i], "C:/Users/me/Desktop/WWD/Excel/dataset[i].xls", sep='\t')
 }

Dans Stata, vous devez préserver et restaurer vos données lorsque vous effectuez une boucle de ce type, mais est-ce également nécessaire dans R ?

5voto

January Points 3990

Vous avez les problèmes suivants :

  1. n'est pas déclarée, donc attempt[i] ne peut pas être attribué. Soit vous en faites une matrice à remplir dans la boucle (si vous voulez conserver les échantillons), soit vous l'utilisez comme variable temporaire. attempt .
  2. Le nom du fichier est pris littérairement, vous devez utiliser paste() o sprintf() pour inclure la valeur de la variable i dans le nom du fichier.

Voici une version fonctionnelle du code :

idorg <- c(1,2,3,4,5)
x <- c(14,20,21,16,17)
y <- c(31,21,20,50,13)
dataset <- cbind (idorg,x,y)

for (i in 1:4)  {
  attempt <- dataset[sample(1:nrow(dataset), 3, replace=FALSE),]
  write.table(attempt, sprintf( "C:/Users/me/Desktop/WWD/Excel/dataset[%d].xls", i ), sep='\t')
}

Excel pourra-t-il lire un tel tableau séparé par des tabulations ? Je n'en suis pas sûr ; je ferais un tableau séparé par des virgules et je l'enregistrerais en tant que .csv .

2voto

Ananda Mahto Points 67213

Contrairement à Stata, vous n'avez pas besoin de préserver et de restaurer vos données pour ce type d'opération dans R.

Je pense que la solution de janvier résout votre problème, mais je voulais vous faire part d'une autre alternative : l'utilisation de lapply() pour obtenir une liste de tous les échantillons de l'ensemble de données :

set.seed(1) # So you can reproduce these results
temp <- setNames(lapply(1:4,
                        function(x) { 
                          x <- dataset[sample(1:nrow(dataset),
                                              3, replace = FALSE), ]; x }),
                 paste0("attempt.", 1:4))

Cela a créé une list() nommé "temp" qui comprend quatre data.frame s.

temp
# $attempt.1
#      idorg  x  y
# [1,]     2 20 21
# [2,]     5 17 13
# [3,]     4 16 50
# 
# $attempt.2
#      idorg  x  y
# [1,]     5 17 13
# [2,]     1 14 31
# [3,]     3 21 20
# 
# $attempt.3
#      idorg  x  y
# [1,]     5 17 13
# [2,]     3 21 20
# [3,]     2 20 21
# 
# $attempt.4
#      idorg  x  y
# [1,]     1 14 31
# [2,]     5 17 13 
# [3,]     4 16 50

Les listes sont très pratiques dans R. Vous pouvez maintenant utiliser lapply() pour faire d'autres choses amusantes, par exemple si vous voulez trouver les sommes des rangées, vous pouvez faire lapply(temp, rowSums) . Ou, si vous voulez produire des fichiers CSV séparés (lisibles par Excel), vous pouvez faire quelque chose comme ceci :

lapply(names(temp), function(x) write.csv(temp[[x]],
                             file = paste0(x, ".csv")))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X