组内的组ID

时间:2019-09-09 12:12:19

标签: r

我想通过在组内编号来创建组ID。这里重要的一点是在组内而不是global编号。在以下示例中,数据应按“ x”分组,并为每个唯一的“ y”值创建唯一的ID号。

df <- data.frame(x=LETTERS[c(1:2, 1, 1:2, 1, 2)], y=LETTERS[c(1, 1, 2, 1, 1, 3, 3)] )

输入

x y  
A A  
B A  
A B  
A A  
B A  
A C  
B C  

所需结果

x y ID  
A A  1  
B A  1  
A B  2  
A A  1  
B A  1  
A C  3  
B C  2  

我希望使用data.table方法,但欢迎所有解决方案。我玩了data.table的.GRP和.N以及seq_len(.N)都无济于事。由于这似乎是一个简单且相当常见的任务,所以我不敢相信这里没有人问过它,我确信至少没有找到它。

3 个答案:

答案 0 :(得分:1)

使用dplyr,您可以执行以下操作:

df %>%
 group_by(x) %>%
 mutate(ID = cumsum(!duplicated(y)))

  x     y        ID
  <fct> <fct> <int>
1 A     A         1
2 B     A         1
3 A     A         1
4 A     B         2
5 B     A         1

根据您的确切数据结构,您可能需要先排列数据:

df %>%
 arrange(x, y) %>%
 group_by(x) %>%
 mutate(ID = cumsum(!duplicated(y)))

data.table相同的可能是:

setDT(df)[, ID := cumsum(!duplicated(y)), by = x]

如果需要先安排它:

setorder(setDT(df), x, y)[, ID := cumsum(!duplicated(y)), by = x]

答案 1 :(得分:1)

这是data.table的解决方案:

library("data.table")

df <- data.table(x=LETTERS[c(1:2, 1, 1:2, 1, 2)], y=LETTERS[c(1, 1, 2, 1, 1, 3, 3)] )
df[, ID:=as.numeric(as.factor(y)), x]
df
# > df
#    x y ID
# 1: A A  1
# 2: B A  1
# 3: A B  2
# 4: A A  1
# 5: B A  1
# 6: A C  3
# 7: B C  2

答案 2 :(得分:0)

这是基本的R解决方案。请注意,它弄乱了数据框的顺序,

do.call(rbind, lapply(split(df, df$x), function(i)cbind(i, ID = match(i$y, unique(i$y)))))

#    x y ID
#A.1 A A  1
#A.3 A A  1
#A.4 A B  2
#B.2 B A  1
#B.5 B A  1