1
votes

comment former 1 colonne à partir d'une colonne existante définissant 3 niveaux en utilisant R?

Mon code

del dmilk
21
320
362
288
81
66
267
235
229
425
383
361
197
260
106
238
74
102
148
197
329
428

Je voudrais former la nouvelle colonne dmilk basée sur des contraintes conditionnelles Quelqu'un peut-il m'aider?


date$dmilk=ifelse(date$del<=100,paste("1",date$dmilk),
    (date$del>=100,paste("2",date$dmilk),
    (date$del>=200,paste("3"date$dmilk),
    (date$del>=300,paste("4",date$dmilk))

r

0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser le dplyr > case_when :

library(tidyverse)

df <- tibble(
  del = c(
    21, 320, 362, 288, 81, 66, 267, 235, 229, 425, 383, 
    361, 197, 260, 106, 238, 74, 102, 148, 197, 329, 428
  )
)

df <- df %>% mutate(
  dmilk = case_when(
    del > 300 ~ 4,
    del > 200 ~ 3,
    del > 100 ~ 2,
    TRUE      ~ 1
  )
)

df

# A tibble: 22 x 2
     del dmilk
   <dbl> <dbl>
 1    21     1
 2   320     4
 3   362     4
 4   288     3
 5    81     1
 6    66     1
 7   267     3
 8   235     3
 9   229     3
10   425     4
# ... with 12 more rows

L'évaluation des conditions case_when est paresseuse. Autrement dit, la première entrée valide est utilisée, j'ai donc changé l'ordre. La dernière option TRUE est nécessaire pour compléter les entrées sans correspondance.


3 commentaires

j'ai 37.000 dels, comment concaténer? J'ai utilisé 22 juste pour expliquer, est-ce que c'est différent? désolé la question est très débutante


@ BD'auria: Il n'y a pas de différence.


Merci les gars, j'apprécie votre aide. J'ai pu le résoudre de manière plus simple. > caseina $ dmilk [caseina $ del <= 100] <- 1> caseina $ dmilk [caseina $ del> = 100] <- 2> caseina $ dmilk [caseina $ del> = 200] <- 3> caseina $ dmilk [ caseina $ del> = 300] <- 4> caseina $ dmilk [caseina $ del> = 400] <- 5



0
votes

J'utiliserais simplement findInterval pour obtenir le numéro que vous voulez, puis créerais dmilk en une seule fois.

Vous ne nous donnez pas ce qui était dans dmilk, alors j'ai juste supposé que c'était le text "filler"

> dat
   del    dmilk
1   21 1 filler
2  320 4 filler
3  362 4 filler
4  288 3 filler
5   81 1 filler
6   66 1 filler
7  267 3 filler
8  235 3 filler
9  229 3 filler
10 425 4 filler
11 383 4 filler
12 361 4 filler
13 197 2 filler
14 260 3 filler
15 106 2 filler
16 238 3 filler
17  74 1 filler
18 102 2 filler
19 148 2 filler
20 197 2 filler
21 329 4 filler
22 428 4 filler

qui donne

dat <- data.frame(del = c(21, 320, 362, 288, 81, 66, 267, 235, 229, 425, 383, 361, 197, 
260, 106, 238, 74, 102, 148, 197, 329, 428), dmilk = "filler")

val <- findInterval(dat$del, c(100, 200, 300))+1 #gives 0-3 so add 1 to get 1-4
dat$dmilk <- paste(val, dat$dmilk)


0 commentaires

0
votes

Si vous souhaitez conserver l'instruction ifelse, vous devez les imbriquer. En outre, les conditions doivent être mutuellement exclusives pour fonctionner correctement. Enfin, vous devez ajouter une valeur par défaut lorsqu'aucune condition n'est remplie (j'ai utilisé NA)

date$dmilk=ifelse(date$del<=100,paste("1",date$dmilk),
                  ifelse(date$del>=100 & date$del<200,paste("2",date$dmilk),
                         ifelse(date$del>=200 & date$del<300,paste("3",date$dmilk),
                                ifelse(date$del>=300,paste("4",date$dmilk), NA))))

Meilleur!


0 commentaires