我有一个 data.frame,其中包含与每个 ActivityID
相关的值,这些值按顺序编号但不是从 1 开始。这是因为我无法控制过滤发生。每个 ActivityID
包含相同 ActivityID
的重复以标记每个值。
例如df<-data.frame(value=runif(50), ActivityID=rep(c(10,18,19,20,34),each=10))
我想重新编号 ActivityID 以从 1 开始,以便所有结果看起来像:
df<-data.frame(value=runif(50), ActivityID=rep(seq(1:5),each=10))
请注意,每个声誉的数量可能会有所不同,因此有时可能是:ActivityID=rep(seq(1:2),each=25)
我尝试转换为因子并返回数字有效,但看起来很笨拙。有没有更简洁的方法?
data.frame(value=runif(25), ActivityID=as.factor(rep(c(10,18,19,20,34),each=5))) %>% mutate(ActivityID2=as.numeric(as.factor(ActivityID)))
value ActivityID ActivityID2
1 0.17469577 10 1
2 0.74912473 10 1
3 0.47619071 10 1
4 0.65868345 10 1
5 0.46414206 10 1
6 0.95534408 18 2
7 0.05125897 18 2
8 0.72084512 18 2
9 0.13255307 18 2
10 0.34281137 18 2
11 0.82067045 19 3
12 0.08923745 19 3
13 0.47769767 19 3
14 0.11153303 19 3
15 0.98863208 19 3
16 0.03486372 20 4
17 0.37039246 20 4
18 0.01890895 20 4
19 0.58501266 20 4
20 0.10254404 20 4
21 0.78895076 34 5
22 0.85010741 34 5
23 0.37808120 34 5
24 0.70489555 34 5
25 0.83963100 34 5
答案 0 :(得分:1)
您可以使用 cur_group_id()
。
library(dplyr)
df %>%
group_by(ActivityID) %>%
mutate(ActivityID2 = cur_group_id())
答案 1 :(得分:1)
您也可以使用 dplyr::dense_rank()
。
library(dplyr, warn.conflicts = F)
data.frame(value=runif(25), ActivityID=as.factor(rep(c(10,18,19,20,34),each=5))) %>%
mutate(ID2 = dense_rank(ActivityID))
#> value ActivityID ID2
#> 1 0.04445442 10 1
#> 2 0.07533451 10 1
#> 3 0.46675858 10 1
#> 4 0.35555307 10 1
#> 5 0.99833030 10 1
#> 6 0.48128773 18 2
#> 7 0.51598496 18 2
#> 8 0.10621133 18 2
#> 9 0.18349920 18 2
#> 10 0.29088374 18 2
#> 11 0.03232032 19 3
#> 12 0.56884196 19 3
#> 13 0.56391102 19 3
#> 14 0.68882695 19 3
#> 15 0.44887127 19 3
#> 16 0.53528115 20 4
#> 17 0.67460873 20 4
#> 18 0.75139184 20 4
#> 19 0.66499921 20 4
#> 20 0.98203906 20 4
#> 21 0.46494209 34 5
#> 22 0.34140739 34 5
#> 23 0.99652580 34 5
#> 24 0.31101698 34 5
#> 25 0.84440767 34 5
由 reprex package (v2.0.0) 于 2021 年 7 月 7 日创建