Weisen Sie eine eindeutige ID basierend auf den Werten in JEDER von zwei Spalten zu

Dec 16 2020

Dies ist kein Duplikat dieser Frage . Bitte lesen Sie die Fragen vollständig durch, bevor Sie Duplikate kennzeichnen.

Ich habe einen data.frame wie folgt:

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 

Ich möchte eine group_idSpalte wie diese hinzufügen :

  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

Die Schwierigkeit besteht darin, dass ich nach eindeutigen Werten von color oder gruppieren möchte shape. Ich vermute, die Lösung könnte darin bestehen, Listenspalten zu verwenden, aber ich kann nicht herausfinden, wie.

Antworten

2 akrun Dec 15 2020 at 23:35

Wir können duplicatedin verwendenbase R

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

-Ausgabe

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

Oder mit tidyverse

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

Daten

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"
))