【问题标题】:Incremental IDs in a R data frame [duplicate]R数据框中的增量ID [重复]
【发布时间】:2016-05-24 01:10:49
【问题描述】:

我有以下数据框:

> 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

我现在希望每一行都有一个 ID,该 ID 仅在 A 的值发生变化时递增。这是我尝试过的:

> 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

【问题讨论】:

  • 你的A栏是不是一直在增加? “当 A 的值发生变化时”是否意味着例如对于 A = 3 3 4 3,您想要 1 1 2 3?
  • 最初,我的 A 列是未排序的,但我会在分配 ID 之前对其进行排序。所以 A = 3 3 4 3 应该是 1 1 2 1 因为我会将它排序为 A = 3 3 3 4
  • 好的,感谢您的澄清。如果链接的问题(在顶部的横幅中,如果您刷新页面)不适合您,请告诉我们。

标签: r dplyr


【解决方案1】:

一个紧凑的选项是使用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 作为 'id'

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

【讨论】:

  • Dplyr 有 group_indices 与 data.table 的 .GRP。不过,我记得它是越野车。 stackoverflow.com/q/23026145/1191259
  • @Frank 看起来 group_indices 不适用于 dplyr_0.4.3
  • @Frank 如果我使用test %>% group_indices(A),它会给出一个向量。
  • 您应该将其中一些解决方案添加到链接的问题中吗?
  • 我做到了,也得到了我的答案。谢谢
【解决方案2】:
library(dplyr)

test %>% mutate(id = dense_rank(A))

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多