2017-06-22 3 views
0

Tenir compte des données maquette suivantes:R - Des solutions plus rapides pour la base :: interaction avec les variables de caractères?

df <- data.frame(a=c("John", "Susan", "Eric", "John", "Susan"), 
       b=c("K", NA, "J", "K", "S"), 
       c=c("Smith", "Johnson", "May", "Smith", "Johnson")) 
df$a <- as.character(df$a) 
df$b <- as.character(df$b) 
df$c <- as.character(df$c) 

qui ressemble à ceci:

> df 
     a b  c 
1 John K Smith 
2 Susan <NA> Johnson 
3 Eric J  May 
4 John K Smith 
5 Susan S Johnson 

je produis une colonne appelée unique qui est titulaire d'un numéro unique sur l'interaction des trois variables de caractère.

J'utilise une déclaration ifelse pour interagir seulement la colonne a et c si la colonne est bNA.

df$unique <- NA 
df$unique <- ifelse(is.na(df$b), 
      as.integer(interaction(df$a, df$c)), 
      as.integer(interaction(df$a, df$b, df$c))) 

Il en résulte:

> df 
     a b  c unique 
1 John K Smith  23 
2 Susan <NA> Johnson  3 
3 Eric J  May  10 
4 John K Smith  23 
5 Susan S Johnson  9 

Lorsque j'utilise ce code pour construire la variable unique dans mes réelles données contenant plusieurs millions de lignes, ce calcul fonctionne pendant 21 heures.

Existe-t-il des moyens d'accélérer cette performance? Des solutions plus intelligentes?

Est-ce que le ifelse est le goulot d'étranglement ici?

Répondre

1

cela fonctionnerait-il?

library(data.table) 
dt1 <- as.data.table(df) 
dt1[, unique := .GRP, by = names(dt1)] 

     a b  c unique 
1: John K Smith  1 
2: Susan NA Johnson  2 
3: Eric J  May  3 
4: John K Smith  1 
5: Susan S Johnson  4