Dans le data.frame df
suivant, je voudrais créer une nouvelle colonne avec des valeurs qui seront dérivées de la classification de la colonne A
. Si nombre si la colonne A
correspond à l'un des nombres du vecteur G1
, dans la nouvelle colonne appelée Groupe
il doit être classé comme "G1". De même, si la valeur de la colonne A
correspond à l'une des valeurs du vecteur G2
, elle doit être classée comme "G2". Les colonnes restantes doivent être classées comme "G0".
A <- seq(1900,2000,1) B <- rnorm(101,10,2) df <- data.frame(A=A,B=B) G1 <- c(1963,1982,1952) G2 <- c(1920,1933,1995) # This doesn't do what I would like it to achieve df$group <- ifelse(df$A == G1,"G1",ifelse(df$A == G2,"G2","G0"))
3 Réponses :
Ce que vous cherchez est
library(dplyr) df %>% mutate(group = case_when(A %in% G1 ~ "G1", A %in% G2 ~ "G2", TRUE ~ "G0"))
qui peut être mieux représenté avec case_when
de dplyr
df$group <- ifelse(df$A %in% G1, "G1", ifelse(df$A %in% G2, "G2", "G0"))
Le problème est que vous ne voulez pas tester si une valeur dans la colonne est égale à A ou B; ce sont des vecteurs et ce test n'a pas de sens. Au lieu de cela, vous voulez savoir si la valeur est un élément de A ou B. Ajustez votre code à
df$group <- ifelse(df$A %in% G1,"G1",ifelse(df$A %in% G2,"G2","G0"))
Cela a fonctionné lorsque je l'ai vérifié. Il existe peut-être une solution plus élégante, mais elle correspond étroitement à votre première tentative.
Merci beaucoup, c'est ce qui a été suggéré par une autre personne aussi, et a fonctionné comme un charme.
Voici une alternative amusante et concise:
df$group <- c("G0", "G1", "G2")[1 + 1 * df$A %in% G1 + 2 * df$A %in% G2]
Nous avons un vecteur de trois options c ("G0", "G1", "G2") code>. En pensant élément par élément, si aucun de
df $ A% dans% G1
et df $ A% dans% G2
n'est vrai, nous choisissons "G0" (en raison de 1 + ...
au début). Puisque G1
et G2
ne se chevauchent pas, "G1" sera choisi uniquement si df $ A% dans% G1
. De même, l'indice est 3 et "G2" est choisi uniquement si df $ A% dans% G2
.