3
votes

Comment diviser aléatoirement des données en trois tailles égales?

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)


5 commentaires

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 de c ("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!


4 Réponses :


2
votes

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)


1 commentaires

Merci beaucoup Phil :)



2
votes

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 ,]


0 commentaires

3
votes

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))


0 commentaires

3
votes

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)))


0 commentaires