2
votes

Classer la colonne dans data.frame en fonction de vecteurs

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


0 commentaires

3 Réponses :


3
votes

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


0 commentaires

1
votes

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.


1 commentaires

Merci beaucoup, c'est ce qui a été suggéré par une autre personne aussi, et a fonctionné comme un charme.



1
votes

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 .


0 commentaires