سؤال

افترض أن لدي بيانات .fame مع صفوف N. ال id العمود لديه 10 قيم فريدة؛ كل هذه القيم أعداد صحيحة أكبر من 1E7. أرغب في إعادة تسميته ليتم ترقيمها من 1 إلى 10 وحفظ هذه المعرفات الجديدة كعمود في بياناتي.

بالإضافة إلى ذلك، أود تحديد 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
هل كانت مفيدة؟

المحلول

جرب هذا:

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

تعليق اضافي:للحصول على جدول القيم:

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

نصائح أخرى

استخدام العوامل:

> 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

افترض y هو المعرف الجديد وتريد القديم.

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

(ما سبق يجد القيمة الأولى للمعرف عندها الرمز الداخلي للعامل هو 5. هل هناك طرق أفضل؟)

يمكنك استخدام عامل () / أمرت () هنا:

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.Nummeric () ل MAP To 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> 

خيار واحد هو استخدام 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 هو المعرف الجديد وتريد القديم.

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

(يمكن أن يكون هذا في بعض الأحيان أكثر ملاءمة / شفافة من استخدام العوامل.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top