我想基于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
答案 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