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
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.)