2015-04-04 5 views
1

Я хочу создать уникальный последовательный числовой идентификатор для каждой отдельной группы на основе 3 столбцов, но для каждой группы идентификаторы должны начинаться с 1 по n.R уникальный идентификатор перенумерации для каждой группы в data.frame

Используя решение в Creating a unique ID, я могу создавать уникальные идентификаторы, но они являются последовательными для всего кадра данных.

k1 <- c(1,1,1,1,1,1,1,1,1,1) 
k2 <- c(1,1,1,1,1,2,2,2,2,2) 
k3 <- rep(letters[1:2],5) 

df <- as.data.frame(cbind(k1,k2, k3)) 

d <- transform(df, id = as.numeric(interaction(k1,k2,k3, drop=TRUE))) 

d <- d[with(d, order(k1,k2,k3)),] 

результат

 
> d 
    k1 k2 k3 id 
1 1 1 a 1 
3 1 1 a 1 
5 1 1 a 1 
2 1 1 b 3 
4 1 1 b 3 
7 1 2 a 2 
9 1 2 a 2 
6 1 2 b 4 
8 1 2 b 4 
10 1 2 b 4 

, и я хотел бы иметь

 
> d 
    k1 k2 k3 id 
1 1 1 a 1 
3 1 1 a 1 
5 1 1 a 1 
2 1 1 b 2 
4 1 1 b 2 
7 1 2 a 1 
9 1 2 a 1 
6 1 2 b 2 
8 1 2 b 2 
10 1 2 b 2 

ответ

2

Попробуйте

d$id <- with(d, ave(id, k2, FUN=function(x) as.numeric(factor(x)))) 
d$id 
#[1] 1 1 1 2 2 1 1 2 2 2 
+0

это работает :) Отлично. но это зависит от предыдущего права ID? как получить идентификатор за один проход? – jcarlos

+1

@jcarlos Я только что использовал предыдущий «id», который вы создали. вы можете напрямую использовать его в группе 'взаимодействия (..)' – akrun

+2

@jcarlos Я думаю, что опция по data.table (ColonelBeauvel) будет более прямой, так как она имеет .GRP' – akrun

3

Попробуйте использовать data.table, как указано в ссылке:

library(data.table) 

setDT(df)[,id:=.GRP,by=list(k1,k3)][] 

# k1 k2 k3 id 
# 1: 1 1 a 1 
# 2: 1 1 b 2 
# 3: 1 1 a 1 
# 4: 1 1 b 2 
# 5: 1 1 a 1 
# 6: 1 2 b 2 
# 7: 1 2 a 1 
# 8: 1 2 b 2 
# 9: 1 2 a 1 
#10: 1 2 b 2 
+0

, но таким образом k2 не используется для оценки id, если я его вставляю, он возвращает мне первое решение. – jcarlos

+0

в результате, который вы предлагаете, k2 не влияет на определение id;) –

+0

В этом специальном случае даже k1 можно опустить. – giordano