2016-02-24 1 views
0

Je cherche une méthode plus efficace de recodage des entrées de colonne dans une trame de données, où le recodage est conditionnel aux entrées des autres colonnes. Prenez cet exemple simple, qui illustre ma procédure actuelle de création d'une nouvelle colonne pour les données recodées, la conversion en caractère, puis en utilisant les crochets du sous-ensemble pour recoder les données (existe-t-il un nom officiel pour cette procédure?).Méthode plus efficace de recodage d'une colonne dans un data.frame conditionnelle à d'autres entrées de colonne

## example data frame 
df = data.frame(id = seq(1 , 100 , by=1) , 
       x = rep(c("W", "Z") , each=50), 
       y = c(rep(c("A","B","C","D") , 25))) 

# add a new column based on column y; convert to character 
df$newY = as.character(df$y) 

# change newY entries to numbers based on conditions in other columns 
df$newY[ df$x == "W" & df$newY == "B" ] <- 1 
df$newY[ df$x == "Z" & df$newY == "D" ] <- 3 

Cette procédure est très bien pour les variables recodage avec un petit nombre de conditions, mais devient encombrant pour plus grand nombre d'arguments conditionnels ou quand il y a beaucoup de variables distinctes recoder.

Quelqu'un pourrait-il m'aider à trouver une méthode plus efficace?

Merci!

+0

Y at-il une sorte de logique ou d'un motif dans le recodage? Par efficacité, voulez-vous dire une méthode qui nécessite moins de frappe ou voulez-vous dire une performance plus rapide/efficacité de la mémoire? –

+0

combien de conditions parlons-nous? – MaxPD

+0

Est-ce que quelque chose comme ceci résoudrait votre problème: 'df $ newY = as.factor (paste0 (df $ y, df $ x)); as.numérique (df $ newY) ' – Raad

Répondre

1

Quelques approches de ce:

df <- data.frame(id = seq(1 , 100 , by=1) , 
       x = rep(c("W", "Z") , each=50), 
       y = c(rep(c("A","B","C","D") , 25))) 

# Take the product (my preference) 
as.numeric(df$x) * as.numeric(df$y) 

# Create new factor based on x and y and convert to numeric 
as.numeric(as.factor(paste0(df$x, df$y))) 
+0

Merci! Cela aide beaucoup. J'ai manqué votre deuxième exemple dans le commentaire à l'OP. – user3237820