2009-08-25 5 views
0

N 행이있는 data.frame이 있다고 가정합니다. id 열에는 10 개의 고유 값이 있습니다. 이 모든 값은 1e7보다 큰 정수입니다. 1에서 10까지 번호를 매기고이 새 ID를 내 data.frame의 열로 저장하고 싶습니다.큰 ID 이름 바꾸기

또한 idid.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 

답변

1

이 시도 :

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

추가 코멘트 : 값의 테이블을 얻을 :

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

우'입니다. 그 생각을하지 않았다. 꽤 매끄럽다. 매핑을 쉽게 복구 할 수있는 방법이 있습니까? –

+0

'unique (A $ id)'를 저장하십시오 - 이것은'levels (factor (A $ id))'와 같습니다. – hadley

1

사용 요인 :

> 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가, 기존의 ID이고 당신은 새로운 것을 원한다.

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

y가 새로운 ID이고 이전 ID를 원한다고 가정하십시오.

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

합니다 (위의 요소에 대한 내부 코드 (5)가 더 나은 방법입니다입니다있는 ID의 첫 번째 값을 찾습니다?)

+0

올드을 새로'으로 필요하지 않습니다. 숫자 '. 새로운 기능은 '레벨 (A $ id) [신형] – hadley

0

하나의 옵션은 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가 이전 ID이고 새 ID를 원한다고 가정합니다.

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

y가 새로운 ID이고 이전 ID를 원한다고 가정하십시오. (.이 때때로 요소를 사용하는 것보다 투명/더 편리 할 수 ​​있습니다)

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

1

사실상 사용할 수 있습니다. R()/정렬() 여기 :

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 

그리고 당신은 다음 (1) ~ 10에 매핑 할 as.numeric 사용할 수 있습니다

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>