2012-04-12 13 views
5

Ho un frame di dati di grandi dimensioni che ha tre identificatori. Per esempio:come assegnare un identificatore univoco a più voci di frame di dati

df <- data.frame(year=c(1999,1999,2000,2000,2000), country=c('K','K','M','M','S'), 
       site=c('di','se','di','di','di')) 

che produrrà un frame di dati come questo:

year country site 
    1999 K  di 
    1999 K  se 
    2000 M  di 
    2000 M  di 
    2000 S  di 

Voglio aggiungere una colonna aggiuntiva al telaio di dati e hanno un 'id unico' assegnato utilizzando le voci per "anno", "paese" e "sito". Sarebbe simile a questa:

year country site unique_id 
    1999 K  di  1 
    1999 K  se  2 
    2000 M  di  3 
    2000 M  di  3 
    2000 S  di  4 

Qualche suggerimento su come fare questo sarebbe molto apprezzato. Sto pensando che potrebbe in qualche modo essere fatto usando il pacchetto plyr?

risposta

7

Questo dovrebbe funzionare abbastanza bene. (Si avvale del fatto che i singoli livelli di un fattore sono effettivamente memorizzati come interi e utilizza as.numeric() per accedere/estrarre quei valori interi).

df$unique_id <- 
    as.numeric(as.factor(with(df, paste(year, country, site, sep="_")))) 
df 
# year country site unique_id 
# 1 1999  K di   1 
# 2 1999  K se   2 
# 3 2000  M di   3 
# 4 2000  M di   3 
# 5 2000  S di   4 
+0

grazie, entrambe queste risposte ha funzionato bene. molto apprezzato. – Austin

+5

forse 'transform (df, unique_id = as.integer (interazione (anno, paese, sito, drop = TRUE))) invece invece – baptiste

+1

@baptiste - Sweet. Questo è molto più bello, e sono felice di conoscere l'argomento 'drop = TRUE' su' interaction() '. –

1

lo farei come questo

lookup <- data.frame(id=1:length(unique(apply(df, 1, paste, collapse=""))), key=unique(apply(df, 1, paste, collapse=""))) 

df$id <- apply(df, 1, function(x) lookup[lookup$key==paste(x, collapse=""), "id"]) 
Problemi correlati