2 votes

Ajout de la valeur d'une colonne jusqu'à ce qu'une condition soit remplie dans R

J'ai un cadre de données appelé demo avec 500 enregistrements comme ceci

 ID  Age 
 1   10 
 2   15
 3   36
 4   20
 .   .
 .   .
497  40
498  5
499  12
500  20

Dans le cadre de données ci-dessus, je veux ajouter une colonne avec des valeurs telles que 25% des enregistrements totaux (dans notre cas 125) doivent être entre 1-3 et le reste, c'est-à-dire 75% (à partir de 126) doivent être entre 4-10, de sorte que la sortie ressemble à ceci

ID  Age  colB
 1   10   2
 2   15   1
 3   36   1
 4   20   3
 .   .
 .   .
497  40   8
498  5    10
499  12   5
500  20   9

J'ai essayé

    function(x) {
      a= row.names(demo)[125]
     a <- FALSE
      while (!a) {

        demo$colB <- sample(nrow(demo), c(1:3))

  }
  return(x)
}

Toute aide serait très appréciée.

1voto

akrun Points 148302

Nous pouvons essayer avec rep y sample

demo$colB <- sample(c(rep(1:3, length.out= ceiling(nrow(demo)*.25)), 
      rep(4:10, length.out=ceiling(nrow(demo)*.75))))[seq_len(nrow(demo))]
sum(demo$colB %in% 1:3)
#[1] 125

Calcul de la sum basé sur l'autre poste

sum(demo$colB %in% 1:3)
#[1] 121

Tous deux ont utilisé le set.seed(1) pour le calcul de la sample (pour le rendre reproductible)

données

set.seed(24)
demo <- data.frame(ID = 1:500, Age = sample(10:99, 500, replace=TRUE))

1voto

Sandipan Dey Points 13663

Essayez ceci (en supposant que vos valeurs dans colB ne dépend pas des valeurs des autres colonnes) :

demo$colB <- sample(1:10, nrow(demo), prob = c(rep(0.25/3, 3), rep(0.75/7, 7)), replace=TRUE)

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