我想通过在组内编号来创建组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)都无济于事。由于这似乎是一个简单且相当常见的任务,所以我不敢相信这里没有人问过它,我确信至少没有找到它。
答案 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