2009-08-25 8 views
0

Supposons que j'ai un data.frame avec N lignes. La colonne id a 10 valeurs uniques; toutes ces valeurs sont des entiers supérieurs à 1e7. Je voudrais les renommer numérotés de 1 à 10 et enregistrer ces nouveaux identifiants sous la forme d'une colonne dans mon fichier data.frame.Renommer des ID volumineux

De plus, je voudrais déterminer facilement 1) id donné id.new et 2) id.new donné id.

Par exemple:

> set.seed(123) 
> ids <- sample(1:1e7,10) 
> A <- data.frame(id=sample(ids,100,replace=TRUE), 
        x=rnorm(100)) 
> head(A) 
     id   x 
1 4566144 1.5164706 
2 9404670 -1.5487528 
3 5281052 0.5846137 
4 455565 0.1238542 
5 7883051 0.2159416 
6 5514346 0.3796395 

Répondre

1

Essayez ceci:

A$id.new <- match(A$id,unique(A$id)) 

commentaire supplémentaire: Pour obtenir le tableau des valeurs:

rbind(unique(A$id.new),unique(A$id)) 
+0

ooooh. Je n'avais pas pensé à ça. C'est plutôt chic. Est-il possible de récupérer facilement le mappage? –

+0

Sauvegardez simplement 'unique (A $ id)' - c'est équivalent à 'levels (facteur (A $ id))' – hadley

1

facteurs Utilisation:

> A$id <- as.factor(A$id) 
> A$id.new <- as.numeric(A$id) 
> head(A) 
     id   x id.new 
1 4566144 1.5164706  4 
2 9404670 -1.5487528  10 
3 5281052 0.5846137  5 
4 455565 0.1238542  1 
5 7883051 0.2159416  7 
6 5514346 0.3796395  6 

Soit X l'ancien ID et que vous voulez le nouveau.

> x <- 7883051 
> as.numeric(which(levels(A$id)==x)) 
[1] 7 

Supposons que y soit le nouvel ID et que vous souhaitiez l'ancien.

> as.numeric(as.character(A$id[which(as.integer(A$id)==y)[1]])) 
[1] 5281052 

(Le trouve au-dessus de la première valeur d'identité à laquelle le code interne du facteur est 5. Existe-t-il des moyens meilleurs?)

+0

ancien vers nouveau n'a pas besoin de la 'que. numeric'. Nouveau à l'ancien est juste 'levels (A $ id) [nouveau]' – hadley

0

Une option consiste à utiliser le package hash:

> library(hash) 
> sn <- sort(unique(A$id)) 
> g <- hash(1:length(sn),sn) 
> h <- hash(sn,1:length(sn)) 
> A$id.new <- .get(h,A$id) 
> head(A) 
     id   x id.new 
1 4566144 1.5164706  4 
2 9404670 -1.5487528  10 
3 5281052 0.5846137  5 
4 455565 0.1238542  1 
5 7883051 0.2159416  7 
6 5514346 0.3796395  6 

Supposons que x est l'ancien ID et que vous voulez le nouveau. Supposons que y soit le nouvel ID et que vous souhaitiez l'ancien.

> y <- 5 
> .get(g,as.character(y)) 
     5 
5281052 

(. Cela peut parfois être plus commode/transparent que l'utilisation de facteurs)

1

Vous pouvez utiliser facto r()/commandé() ici:

R> set.seed(123) 
R> ids <- sample(1:1e7,10) 
R> A <- data.frame(id=sample(ids,100,replace=TRUE), x=rnorm(100)) 
R> A$id.new <- as.ordered(as.character(A$id)) 
R> table(A$id.new) 

2875776 4089769 455565 4566144 5281052 5514346 7883051 8830172 8924185 9404670 
     6  10  6  8  12  10  13  10  10  15 

Et vous pouvez alors utiliser as.numeric() pour la carte à 1 à 10:

R> A$id.new <- as.numeric(A$id.new) 
R> summary(A) 
     id    x    id.new  
Min. : 455565 Min. :-2.3092 Min. : 1.00 
1st Qu.:4566144 1st Qu.:-0.6933 1st Qu.: 4.00 
Median :5514346 Median :-0.0634 Median : 6.00 
Mean :6370243 Mean :-0.0594 Mean : 6.07 
3rd Qu.:8853675 3rd Qu.: 0.5575 3rd Qu.: 8.25 
Max. :9404670 Max. : 2.1873 Max. :10.00 
R>