我有以下数据框:
> test = data.frame(A = sample(1:5, 10, replace = T)) %>% arrange(A)
> test
A
1 1
2 1
3 1
4 2
5 2
6 2
7 2
8 4
9 4
10 5
我现在希望每一行都有一个只在A的值发生变化时才会增加的ID。这就是我的尝试:
> test = test %>% mutate(id = as.numeric(rownames(test))) %>% group_by(A) %>% mutate(id = min(id))
> test
A id
(int) (dbl)
1 1 1
2 1 1
3 1 1
4 2 4
5 2 4
6 2 4
7 2 4
8 4 8
9 4 8
10 5 10
但是,我想得到以下内容:
A id
(int) (dbl)
1 1 1
2 1 1
3 1 1
4 2 2
5 2 2
6 2 2
7 2 2
8 4 3
9 4 3
10 5 4
答案 0 :(得分:6)
library(dplyr)
test %>% mutate(id = dense_rank(A))
答案 1 :(得分:5)
一个紧凑的选项是使用data.table
。转换' data.frame'到' data.table' (setDT(test)
),按' A'分组,我们指定(:=
).GRP
作为新的' id'柱。 .GRP
将是' A'中每个唯一值的一系列值。
library(data.table)
setDT(test)[, id:=.GRP, A]
如果' A'像3, 3, 4, 3
这样的更改,我们想要1, 1, 2, 3
来识别'
setDT(test)[, id:= rleid(A)]
或者我们转换A'到factor
课程,然后将其强制转回numeric/integer
library(dplyr)
test %>%
mutate(id = as.integer(factor(A)))
或者我们可以match
' A'使用' A'中的unique
值。
test %>%
mutate(id = match(A, unique(A)))
或dplyr
版本> 0.4.0
,我们可以使用group_indices
(它在欺诈链接中)
test %>%
mutate(id=group_indices_(test, .dots= "A"))