【问题标题】:Assign a serial number to duplicated values of a vector in R为R中向量的重复值分配序列号
【发布时间】:2021-01-28 20:38:47
【问题描述】:

我想在不使用 for 循环的情况下为 R 中向量的重复值分配一个序列号,如下例所示。我有一个大数据集。 谢谢

a<-c("A","B","A","A","B","C","D","E","D")

预期输出:

desired.answer<-c(1,1,2,3,2,1,1,1,2)

【问题讨论】:

  • 你能用dput给我们一个你的数据集的例子吗?最好使用重复值 init
  • a

标签: r


【解决方案1】:

使用您提供的数据,您可以使用 dplyr 包中的 group_by 函数,然后为每个组独立分配序列号。

data.frame(value = c("A","B","A","A","B","C","D","E","D") ) %>% 
  group_by(value) %>% 
  mutate(serial_number = 1:n())
A tibble: 9 x 2
Groups:   value [5]
 value serial_number
 <chr>         <int>
1 A                 1
2 B                 1
3 A                 2
4 A                 3
5 B                 2
6 C                 1
7 D                 1
8 E                 1
9 D                 2

【讨论】:

    【解决方案2】:

    我不确定您的数据集有多大,但您也可以考虑使用data.table 进行管理。在这里,您可以将serial_number 设置为从 1 到组中元素数 (.N) 之间的值,然后按向量中的每个常见值进行分组。

    library(data.table)
    
    dt <- data.table(a)
    dt[, serial_number := 1:.N, by = a]
    

    或者,按照@markus 的建议使用rowid

    dt[, serial_number := rowid(a)]
    

    输出

       a serial_number
    1: A             1
    2: B             1
    3: A             2
    4: A             3
    5: B             2
    6: C             1
    7: D             1
    8: E             1
    9: D             2
    

    【讨论】:

    • 你可以在这里使用data.table::rowid(a)
    猜你喜欢
    • 2017-04-04
    • 2018-12-13
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多