2012-04-12 6 views
5

Tengo un marco de datos grande que tiene tres identificadores. Por ejemplo:cómo asignar un identificador único a múltiples entradas de marcos de datos

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

que producirá una trama de datos de esta manera:

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

Quiero añadir una columna adicional a la trama de datos y tienen un 'identificador único' asignado por el uso de las entradas para 'año', 'país' y 'sitio'. Se vería algo como esto:

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 

¿Alguna sugerencia sobre cómo hacer esto sería muy apreciado. Estoy pensando que de alguna manera podría hacerse utilizando el paquete plyr?

Respuesta

7

Esto debería funcionar bastante bien. (Aprovecha el hecho de que los niveles únicos de un factor se almacenan realmente como enteros, y usa as.numeric() para acceder/extraer esos valores enteros).

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

gracias, ambas de estas respuestas ha funcionado bien. muy apreciado. – Austin

+5

tal vez 'transform (df, unique_id = as.integer (interaction (year, country, site, drop = TRUE))) 'en su lugar – baptiste

+1

@baptiste - Sweet. Eso es mucho más agradable, y me alegra aprender sobre el argumento 'drop = TRUE' para' interaction() '. –

1

lo haría de la misma familia

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"]) 
Cuestiones relacionadas