2つの列のいずれかの値に基づいて一意のIDを割り当てます

Dec 16 2020

これはこの質問の複製ではありません。重複にラベルを付ける前に、質問を完全に読んでください。

私は次のようなdata.frameを持っています:

library(tidyverse)

tibble(
  color = c("blue", "blue", "red", "green", "purple"),
  shape = c("triangle", "square", "circle", "hexagon", "hexagon")
)

  color  shape   
  <chr>  <chr>   
1 blue   triangle
2 blue   square  
3 red    circle  
4 green  hexagon 
5 purple hexagon 

次のようなgroup_id列を追加したいと思います。

  color  shape    group_id
  <chr>  <chr>       <dbl>
1 blue   triangle        1
2 blue   square          1
3 red    circle          2
4 green  hexagon         3
5 purple hexagon         3

難しいのは、color またはの 一意の値でグループ化したいことですshape。解決策はリスト列を使用することかもしれないと思いますが、その方法がわかりません。

回答

2 akrun Dec 15 2020 at 23:35

私たちは、使用することができますduplicatedbase R

df1$group_id <- cumsum(!Reduce(`|`, lapply(df1, duplicated)))

-出力

df1
# A tibble: 5 x 3
#  color  shape    group_id
#  <chr>  <chr>       <int>
#1 blue   triangle        1
#2 blue   square          1
#3 red    circle          2
#4 green  hexagon         3
#5 purple hexagon         3

またはを使用して tidyverse

library(dplyr)
library(purrr)
df1 %>%
    mutate(group_id = map(.,  duplicated) %>%
                         reduce(`|`) %>%
                         `!` %>% 
                       cumsum)

データ

df1 <- structure(list(color = c("blue", "blue", "red", "green", "purple"
), shape = c("triangle", "square", "circle", "hexagon", "hexagon"
)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))