R数据帧中的增量ID

时间:2016-02-12 18:55:54

标签: r dplyr

我有以下数据框:

> 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

2 个答案:

答案 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"))