2009-08-25 16 views
0

Angenommen, ich habe einen data.frame mit N Zeilen. Die id Spalte hat 10 eindeutige Werte; Alle diese Werte sind ganze Zahlen größer als 1e7. Ich möchte sie umbenennen, um von 1 bis 10 nummeriert zu werden, und diese neuen IDs als eine Spalte in meinem data.frame speichern.Große IDs umbenennen

Außerdem würde Ich mag einfach 1) id gegeben id.new und id.new 2) id gegeben bestimmen.

Zum Beispiel:

> 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 

Antwort

1

Try this:

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

Zusätzliche Kommentar: Um die Tabelle der Werte zu erhalten:

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

ooooh. Hatte nicht daran gedacht. Das ist ziemlich glatt. Gibt es eine Möglichkeit, das Mapping einfach wiederherzustellen? –

+0

Speichern Sie einfach 'unique (A $ id)' - es ist äquivalent zu 'levels (Faktor (A $ id))' – hadley

1

Verwendung von Faktoren:

> 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 

Angenommen, x ist die alte ID und Sie die neue möchten.

Angenommen, y ist die neue ID und Sie möchten die alte ID.

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

(Die oben findet den ersten Wert von id, bei dem der interne Code für den Faktor ist 5. Gibt es bessere Möglichkeiten?)

+0

Old neue braucht nicht die 'wie. numerisch'. Neu zu alt ist nur 'Ebenen (A $ ID) [neu]' – hadley

0

Eine Option ist das hash Paket zu verwenden:

> 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 

Angenommen, x ist die alte ID und Sie möchten die neue ID.

> x <- 7883051 
> .get(h,as.character(x)) 
7883051 
     7 

Angenommen, y ist die neue ID und Sie möchten die alte ID.

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

(. Dies kann manchmal bequemer/transparent sein kann als Faktoren)

1

Sie können facto verwenden r()/bestellt() hier:

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 

Und Sie können dann() verwenden, as.numeric auf 1 bis 10 zur Karte:

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>