对data.frame中的每个组进行R唯一ID重新编号

时间:2015-04-04 14:37:56

标签: r dataframe unique

我想基于3列为每个不同的组创建唯一的连续数字ID,但是对于每个组,ID必须从1到n开始。

使用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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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