Переименование больших идентификаторов - PullRequest
0 голосов
/ 26 августа 2009

Предположим, у меня есть data.frame с N строками. Столбец id имеет 10 уникальных значений; все эти значения являются целыми числами больше 1e7. Я хотел бы переименовать их в номера от 1 до 10 и сохранить эти новые идентификаторы в виде столбца в моем data.frame.

Кроме того, я хотел бы легко определить 1) id с учетом id.new и 2) id.new с учетом id.

Например:

> 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

Ответы [ 4 ]

1 голос
/ 26 августа 2009

Вы можете использовать коэффициент () / order () здесь:

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 

И затем вы можете использовать as.numeric () для сопоставления с 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> 
1 голос
/ 26 августа 2009

Попробуйте это:

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

Дополнительный комментарий: Чтобы получить таблицу значений:

rbind(unique(A$id.new),unique(A$id))
1 голос
/ 26 августа 2009

Использование факторов:

> 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

Предположим, что x это старый идентификатор, а вы хотите новый.

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

Предположим, у - новый идентификатор, а вы хотите старый.

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

(Выше указано первое значение id, при котором внутренний код для коэффициента равен 5. Есть ли лучшие способы?)

0 голосов
/ 26 августа 2009

Один из вариантов - использовать пакет 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

Предположим, что x это старый идентификатор, а вы хотите новый.

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

Предположим, у - новый идентификатор, а вы хотите старый.

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

(Иногда это может быть более удобным / прозрачным, чем использование факторов.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...