如果列中的值在 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,比如 [ID
—Location
] 这对夫妇,你可以。
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
我在数据框中有一列 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,比如 [ID
—Location
] 这对夫妇,你可以。
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