J'ai un ensemble de données avec 9558 lignes provenant de trois projets différents. Je souhaite diviser au hasard cet ensemble de données en trois groupes égaux et attribuer un ID unique à chaque groupe, de sorte que Project1_Project_2_Project3
devienne Project1
, Project2
et Projet3 .
J'ai essayé beaucoup de choses et recherché des codes de personnes ayant des problèmes similaires à moi. J'ai utilisé sample_n ()
et sample_frac ()
, mais malheureusement je ne peux pas résoudre ce problème moi-même: /
J'ai fait un exemple de mon ensemble de données ressemblant à ceci:
ProjectName Count of rows Project1 3186 Project2 3186 Project3 3186
Et la sortie doit être divisée au hasard en trois groupes égaux de nrow = 3186
, puis assignée aux valeurs
ProjectName <- c("Project1_Project2_Project3") data <- data.frame(replicate(10,sample(0:1,9558,rep=TRUE))) data <- data.frame(ProjectName, data)
4 Réponses :
Ajoutez un id
à data
:
nrow(project1) nrow(project2) nrow(project3)
Prenez le premier échantillon:
# should all be FALSE any(project1$id %in% project2$id) any(project1$id %in% project3$id) any(project2$id %in% project3$id)
Merci beaucoup Phil :)
J'ai eu ce même problème une fois. Voilà comment je l'ai fait. Si vous utilisez simplement sample, les groupes sont inégaux, en échantillonnant un vecteur où les groupes sont même travaillés pour moi.
sampleframe <- rep(1:3, ceiling( nrow( data)/3 ) ) data$grp <- 0 data[ , "grp" ] <- sample( sampleframe , size=nrow( data) , replace=FALSE ) project1 <- data[data$grp %in% 1 ,] project2 <- data[data$grp %in% 2 ,] project3 <- data[data$grp %in% 3 ,]
J'aime la solution dans ce commentaire à un gist Github.
Vous pouvez générer les indices comme suggéré:
datalist <- lapply(folds, function(x) data[x, ])
Ensuite, obtenez une liste de 3 blocs de données de taille égale en utilisant:
folds <- split(sample(nrow(data), nrow(data), replace = FALSE), as.factor(1:3))
OMI, il devrait être suffisant d'attribuer uniquement des noms de projet aléatoires.
set.seed(42) dat <- data.frame(replicate(10, sample(0:1, 9558, rep=TRUE)))
Résultat[
head(dat) # X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 ProjectName # 1 1 1 0 1 1 1 1 0 1 0 Project1 # 2 1 1 1 1 1 1 0 0 1 0 Project1 # 3 0 0 1 1 0 0 0 1 1 1 Project1 # 4 1 1 1 0 1 0 1 1 0 1 Project3 # 5 1 0 0 1 1 1 1 0 0 1 Project1 # 6 1 0 0 0 0 1 0 1 1 1 Project3 table(dat$ProjectName) # Project1 Project2 Project3 # 3186 3186 3186
Données em>
dat$ProjectName <- sample(factor(rep(1:3, length.out=nrow(dat)), labels=paste0("Project", 1:3)))
quand vous dites split, cela signifie que vous ne voulez pas de répétitions dans les groupes, non? comme dans les données dans 15 est seulement dans 1 ensemble
Est-ce que
c ("Project1", "Project2", "Project3")
au lieu dec ("Project1_Project2_Project3")
vous donne ce que vous voulez?@ Hojo.Timberwolf Oui, je ne veux pas de répétitions dans les groupes. Que voulez-vous dire par 15 est seulement 1 ensemble?
@ jay.sf Le vrai jeu de données que j'ai contient des données de trois projets différents et il n'y a qu'un seul identifiant unique pour cela et il est structuré de la même manière que celui que j'ai créé. Mais je voudrais le diviser au hasard en trois groupes égaux et chaque groupe devrait avoir son propre nom: Project1, Project2 et Project3 :)
Cette question doit être simplement modifiée et posée d'une meilleure manière pour être également utile aux autres!