2011-09-13 16 views
8

Me gustaría combinar tres columnas en uno de mis conjuntos de datos en uno con el nombre de variable "al_anim" y eliminar los duplicados, clasificar los valores (identificadores de animales) de menor a mayor, y volver a numerar cada animal de 1 a N bajo el nombre de variable "new_id".Reorganizar varias columnas en un conjunto de datos en una columna usando R

anim1 <- c(1456,2569,5489,1456,4587) 
anim2 <- c(6531,6987,6987,15487,6531) 
anim3 <- c(4587,6548,7894,3215,8542) 
mydf <- data.frame(anim1,anim2,anim3) 

¡Cualquier ayuda sería muy apreciada!

Baz

Respuesta

14

Usando mydf de su ejemplo:

mydf <- data.frame(anim1, anim2, anim3) 

Pila los datos:

sdf <- stack(mydf) 

después calcular los elementos únicos usando unique()

uni <- unique(sdf[, "values"]) 

y entonces esto va a conseguir un nuevo animal Identificación

new_id <- as.numeric(as.factor(sort(uni))) 

que daría:

> new_id 
[1] 1 2 3 4 5 6 7 8 9 10 11 

Sin embargo esto es totalmente trivial; seq_along(uni) te lleva allí mucho más fácilmente. Por eso me pregunto si quieres

newdf <- data.frame(anim = sort(uni), new_id = seq_along(uni)) 
merge(sdf, newdf, by.x = "values", by.y = "anim") 

lo que da:

> merge(sdf, newdf, by.x = "values", by.y = "anim") 
    values ind new_id 
1 1456 anim1  1 
2 1456 anim1  1 
3 2569 anim1  2 
4 3215 anim3  3 
5 4587 anim1  4 
6 4587 anim3  4 
7 5489 anim1  5 
8 6531 anim2  6 
9 6531 anim2  6 
10 6548 anim3  7 
11 6987 anim2  8 
12 6987 anim2  8 
13 7894 anim3  9 
14 8542 anim3  10 
15 15487 anim2  11 

Hay una cantidad de ambigüedad en su pregunta que podría ser aliviado por dar un resultado/salida esperada.

+0

Gracias por su ayuda y sugerencias. Voy a mejorar en eso la próxima vez! ¡Gracias de nuevo! – baz

+0

@baz ¿Lo entendí bien? ¿Es útil? –

+0

¡Oh, sí! .... muy útil y me dio lo que necesito. ¡Muchas gracias! – baz

Cuestiones relacionadas