如果列中的值在 R 中相等,则创建数字离散值

Create numerical discrete values if values in a column equal in R

我在数据框中有一列 ID,有时会有重复,例如,

ID
209
315
109
315
451
209

我想要做的是利用这一列并创建另一列来指示该行所属的 ID。即我希望它看起来像,

ID ID Category
209 1
315 2
109 3
315 2
451 4
209 1

本质上,我想遍历 ID,如果它等于前一个 ID,我表明它来自同一个 ID,如果它是一个新 ID,我为它创建一个新指标。

有谁知道 R 中有一个我可以用来做这个的快速函数吗?或者有什么其他建议?

library(tidyverse)

data <- tibble(ID= c(209,315,109,315,451,209))

data %>%
  left_join(
    data %>%
      distinct(ID) %>%
      mutate(`ID Category` = row_number())
  )
#> Joining, by = "ID"
#> # A tibble: 6 × 2
#>      ID `ID Category`
#>   <dbl>         <int>
#> 1   209             1
#> 2   315             2
#> 3   109             3
#> 4   315             2
#> 5   451             4
#> 6   209             1

reprex package (v2.0.0)

于 2022 年 3 月 10 日创建

转换为按 unique(数据集中出现的顺序)排序的水平因子,然后转换为数值:

data$IDCategory <- as.numeric(factor(data$ID, levels = unique(data$ID)))

#> data
#   ID IDCategory
#1 209          1
#2 315          2
#3 109          3
#4 315          2
#5 451          4
#6 209          1
df <- df %>%
  dplyr::mutate(`ID Category` = as.numeric(interaction(ID, drop=TRUE)))

回答data.table

library(data.table)
df <- as.data.table(df)

df <- df[
  j = `ID Category` := as.numeric(interaction(ID, drop=TRUE))
]

此解决方案的优点是您可以为一组变量创建一个唯一的 ID。在这里你只需要 ID,但如果你想有一个唯一的 ID,比如 [IDLocation] 这对夫妇,你可以。

data <- tibble(ID= c(209,209,209,315,315,315), Location = c("A","B","C","A","A","B"))
data <- data %>%
  dplyr::mutate(`ID Category` = as.numeric(interaction(ID, Location, drop=TRUE)))

另一种方式:

merge(data,
  data.frame(ID = unique(data$ID),
             ID.Category = seq_along(unique(data$ID))
  ), sort = F)
  
# ID ID.Category
# 1 209           1
# 2 209           1
# 3 315           2
# 4 315           2
# 5 109           3
# 6 451           4

数据:

tibble(ID = c(209,315,109,315,451,209)) -> data