2017-07-13 14 views
7

Chciałbym generować indeksy do grupowania obserwacji na podstawie dwóch kolumn. Ale chcę, aby grupy były wykonane z obserwacji, które dzielą, przynajmniej jedną obserwację w przestrzeni wspólnej. Widzę, jak tworzyć grupy na podstawie obserwacji, które mają wspólną obserwację, ale nie tylko jedną.Utwórz group_indices na podstawie kilku kolumn

Na przykład, z ramką danych:

dt <- data.frame(id=1:10, 
      G1 = c("A","A","B","B","C","C","C","D","E","F"), 
      G2 = c("Z","X","X","Y","W","V","U","s","T","T")) 

Chciałbym dostać kolumnie

1,1,1,1,2,2,2,3,4,4 

Próbowałem z group_indices z dplyr, ale jeszcze nie udało.

Odpowiedz

11

Korzystanie igraph członkostwa get, następnie map na nazwami:

library(igraph) 

# convert to graph, and get clusters membership ids 
g <- graph_from_data_frame(df1[, c(2, 3, 1)]) 
myGroups <- components(g)$membership 

myGroups 
# A B C D E F Z X Y W V U s T 
# 1 1 2 3 4 4 1 1 1 2 2 2 3 4 

# then map on names 
df1$group <- myGroups[df1$G1] 


df1 
# id G1 G2 group 
# 1 1 A Z  1 
# 2 2 A X  1 
# 3 3 B X  1 
# 4 4 B Y  1 
# 5 5 C W  2 
# 6 6 C V  2 
# 7 7 C U  2 
# 8 8 D s  3 
# 9 9 E T  4 
# 10 10 F T  4 
+0

@akrun Dzięki, ale obawia się, że to nie jest dplyr, a wejście zmieni ... – zx8754

+0

Dziękuję, to odpowiedź wydaje się dobre dla mnie wolałbym raczej odpowiedź dplyr, ale i tak jest w porządku. Nie rozumiem, co masz na myśli przez "dane wejściowe ulegną zmianie": czy twoja metoda nie będzie działać z innymi danymi? – Malta

+0

@Malta, ponieważ nie mamy prawdziwych danych, nie mogę powiedzieć, czy twoje dane są podobne do twojego przykładu, wtedy wszystkie powinny działać zgodnie z oczekiwaniami. – zx8754