2015-04-04 63 views
1

我想根據3列爲每個不同的組創建唯一的順序數字ID,但對於每個組,ID必須從1開始到n。R對數據中每個組的R唯一ID重新編號

使用Creating a unique ID的解決方案,我可以創建唯一的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權利?如何在一次傳球中擁有ID? – jcarlos 2015-04-04 14:49:54

+1

@jcarlos我剛剛使用了您創建的以前的'id'。你可以直接在'interaction(..)'組中使用它 – akrun 2015-04-04 14:50:36

+2

@jcarlos我認爲data.table(ColonelBeauvel)的選項會更加直接,因爲它有'.GRP' – akrun 2015-04-04 14:54:09

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 2015-04-04 15:03:37

+0

由你提出的結果,k2對確定id沒有影響;) – 2015-04-04 15:09:56

+0

在這種特殊情況下,甚至可以省略k1。 – giordano 2016-02-19 14:56:30