Помечать различные комбинации в нескольких столбцах в R - PullRequest
0 голосов
/ 03 марта 2020

Я хочу создать новый столбец, который будет помечать каждую уникальную комбинацию значений в столбцах x, y, z. Мой текущий способ достижения этой цели:

> library(tidyverse) 
> 
> set.seed(100)
> df = tibble(x = sample.int(5, 50, replace = T), y = sample.int(5, 50, replace = T), z = sample.int(5, 50, replace = T))
> df
# A tibble: 50 x 3
       x     y     z
   <int> <int> <int>
 1     2     4     4
 2     3     4     4
 3     1     3     5
 4     2     1     4
 5     4     2     5
 6     4     5     2
 7     2     3     4
 8     3     5     4
 9     2     4     1
10     5     5     2
# … with 40 more rows
> 
> df2 = df %>% distinct(x,y,z) %>% rowid_to_column("unique_id") %>% left_join(df)
Joining, by = c("x", "y", "z")
> df2
# A tibble: 50 x 4
   unique_id     x     y     z
       <int> <int> <int> <int>
 1         1     2     4     4
 2         2     3     4     4
 3         3     1     3     5
 4         4     2     1     4
 5         4     2     1     4
 6         5     4     2     5
 7         5     4     2     5
 8         6     4     5     2
 9         6     4     5     2
10         7     2     3     4
# … with 40 more rows

Какой лучший / более эффективный способ сделать это на довольно большом наборе данных? Я хотел бы остаться в пределах tidyverse, но также открыт для других предложений.

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы можете использовать rleidv из data.table

df$unique_id <- data.table::rleidv(df)

В dplyr мы можем использовать для этой цели функцию group_indices, которая генерирует уникальный идентификатор для каждой группы значений.

library(dplyr)
df %>% mutate(unique_id = group_indices(., x, y, z))
0 голосов
/ 03 марта 2020

В devel версии dplyr мы можем использовать cur_group_id

library(dplyr)
df %>%
     group_by_all() %>% 
     mutate(unique_id = cur_group_id())

или использовать .GRP из data.table

library(data.table)
setDT(df)[, unique_id := .GRP, names(df)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...