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))
3 Réponses :
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.
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
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)
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!