下面是我要转换的数据框(玩具示例),以便组变为1、1、2、2、3、3、3。
group y
C -1.55461160
C 0.34945015
A 0.57210825
A -0.88019528
H 0.03307085
H 1.13494754
H -1.65146164
我当前的解决方案是计算组数和每个组的记录数,并使用这两部分来重新创建组变量,即
ngroups <- length(unique(df$group))
npergroup <- aggregate(x = rep(1, nrow(df)), by = list(df$group), FUN = sum)$x
df <- df %>%
mutate(group = rep(1:ngroups, npergroup))
出于优雅的考虑,您是否具有完整的 dplyr 解决方案?
答案 0 :(得分:4)
一种可能是:
df %>%
mutate(group2 = cumsum(!duplicated(group)))
group y group2
1 C -1.55461160 1
2 C 0.34945015 1
3 A 0.57210825 2
4 A -0.88019528 2
5 H 0.03307085 3
6 H 1.13494754 3
7 H -1.65146164 3
或者您可以使用类似rleid()
的函数:
df %>%
mutate(group2 = with(rle(group), rep(seq_along(lengths), lengths)))
如果您只想为“组”分配唯一的ID:
df %>%
mutate(group2 = group_indices(., group))
group y group2
1 C -1.55461160 2
2 C 0.34945015 2
3 A 0.57210825 1
4 A -0.88019528 1
5 H 0.03307085 3
6 H 1.13494754 3
7 H -1.65146164 3
答案 1 :(得分:1)
这不是dplyr,但还不错。
library(data.table)
library(dplyr)
df%>%
mutate(group = rleid(group))
group y
1 1 -1.55461160
2 1 0.34945015
3 2 0.57210825
4 2 -0.88019528
5 3 0.03307085
6 3 1.13494754
7 3 -1.65146164