Frage

Angenommen, ich eine data.frame mit N Reihen haben. Die id Spalte 10 eindeutige Werte; Alle diese Werte sind ganze Zahlen größer als 1E7. Ich mag sie umbenennen zu 1 bis 10 und speichert diese neuen IDs als eine Spalte in meinem data.frame nummeriert werden.

Darüber hinaus möchte ich einfach 1) id gegeben id.new und 2) id.new gegeben id 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
War es hilfreich?

Lösung

Versuchen Sie diese:

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

Zusätzlicher Kommentar: Um die Tabelle des Wertes zu erhalten:

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

Andere Tipps

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.

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

Angenommen, y die neue ID ist und Sie die alten.

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

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

Sie können Faktor verwenden () / 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 mit 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> 

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 die neue.

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

Angenommen, y die neue ID ist und Sie die alten.

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top