2015-04-04 87 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