R语言 如何为列中的每组相同值分配唯一的ID号[重复]

kwvwclae  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(167)

此问题已在此处有答案

Add ID column by group [duplicate](4个答案)
6年前关闭。
我有一个包含多个列的数据框。我想创建一个名为“id”的新列,它为“sample”列中的每组相同值提供一个唯一的id号。
示例数据:

df <- data.frame(
  index = 1:30,
  val = c(
    14L, 22L, 1L, 25L, 3L, 34L, 35L, 36L, 24L, 35L, 33L, 31L, 30L,
    30L, 29L, 28L, 26L, 12L, 41L, 36L, 32L, 37L, 56L, 34L, 23L, 24L,
    28L, 22L, 10L, 19L
  ),
  sample = c(
    5L, 6L, 6L, 7L, 7L, 7L, 8L, 9L, 10L, 11L, 11L, 12L, 13L, 14L,
    14L, 15L, 15L, 15L, 16L, 17L, 18L, 18L, 19L, 19L, 19L, 20L, 21L,
    22L, 23L, 23L
  )
)

最后我想说的是:

index val sample id
1     1  14      5  1
2     2  22      6  2
3     3   1      6  2
4     4  25      7  3
5     5   3      7  3
6     6  34      7  3
ovfsdjhp

ovfsdjhp1#

不如

df2 <- transform(df,id=as.numeric(factor(sample)))


我认为这个(从Add ID column by group中剽窃而来)应该稍微更有效,尽管可能有点难以记住:

df3 <- transform(df, id=match(sample, unique(sample)))
all.equal(df2,df3)  ## TRUE

如果你想在tidyverse中做到这一点:

library(dplyr)
df %>% group_by(sample) %>% mutate(id=cur_group_id())
hsgswve4

hsgswve42#

以下是data.table解决方案

library(data.table)
setDT(df)[, id := .GRP, by = sample]

相关问题