2011-09-13 4 views
8

vorrei coniugare tre colonne in uno dei miei insiemi di dati in uno con nome variabile "al_anim" e rimuovere i duplicati, classificare i valori (IDS animali) dal più basso al più alto e ri-numerare ogni animale da 1 a N sotto il nome della variabile "new_id".riorganizzare più colonne in un insieme di dati in una colonna utilizzando 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) 

Qualsiasi aiuto sarebbe molto apprezzato!

Baz

risposta

14

Utilizzando mydf dal vostro esempio:

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

Stack i dati:

sdf <- stack(mydf) 

Poi calcolare gli elementi unici utilizzando unique()

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

e poi questo otterrà loro un nuovo id animale

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

che darebbe:

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

Tuttavia che è del tutto banale; seq_along(uni) ti porta lì molto più facilmente. Quindi mi chiedo se si vuole

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

che dà:

> 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 

C'è una quantità di ambiguità nella sua domanda che potrebbe essere alleviato, dando un risultato/output previsto.

+0

Grazie per il vostro aiuto e suggerimenti. Ci riproverò la prossima volta! Grazie ancora! – baz

+0

@baz Ho capito bene? È utile? –

+0

Oh sì! .... molto utile e mi ha dato quello che mi serve. Molte grazie! – baz