Групиране по групи

Как мога да извърша групиране по групи? Например вземете този набор от данни за Pokemon на Kaggle.

Извадка от този набор от данни изглежда така (промених някои полета, за да имитират моите данни):

Name                        Type I  Type II
Bulbasaur                   Grass   Poison  
Bulbasaur 2                 Grass   Poison  
Venusaur                    Grass   Not Null
VenusaurMega Venusaur       Grass   Not Null
...
Charizard                   Fire    Flying
CharizardMega Charizard X   Fire    Dragon

Ако предположим, че няма нули в моя набор от данни, как мога да групирам съответно по колоните тип I и тип II и след това да групирам по сходство между имената?

Резултатът трябва да бъде така:

Name                        Type I  Type II  Cluster
Bulbasaur                   Grass   Poison   1
Bulbasaur 2                 Grass   Poison   1
Venusaur                    Grass   Not Null 2
VenusaurMega Venusaur       Grass   Not Null 2
...
Charizard                   Fire    Flying   3
CharizardMega Charizard X   Fire    Dragon   4

Опитах метод, подобен на показания тук, но той не работи с NbClust функция, която използвам.

clust <- NbClust(data, diss= string_dist, distance=NULL, min.nc = 2, max.nc = 125, method="ward.D2", index="ch")

person cocanut    schedule 23.05.2017    source източник
comment
виж ?rleid,...   -  person Tonio Liebrand    schedule 23.05.2017
comment
Вижте в целта за измама. Мисля, че това е, което търсите. rleid ще групира непоследователни появявания на една и съща стойност в отделни групи.   -  person David Arenburg    schedule 25.05.2017
comment
Тук няма групиране, само групиране по. Какво представлява статистическата оптимизация за групиране?   -  person Has QUIT--Anony-Mousse    schedule 03.06.2017


Отговори (2)


Можете да използвате: rleid от library(data.table).

df <- fread("
#,Name,Type 1,Type 2,Total,HP,Attack,Defense,Sp. Atk,Sp. Def,Speed,Generation,Legendary
1,Bulbasaur,Grass,Poison,318,45,49,49,65,65,45,1,False
      2,Ivysaur,Grass,Poison,405,60,62,63,80,80,60,1,False
      3,Venusaur,Grass,Poison,525,80,82,83,100,100,80,1,False
      3,VenusaurMega Venusaur,Grass,Poison,625,80,100,123,122,120,80,1,False
      4,Charmander,Fire,,309,39,52,43,60,50,65,1,False
      5,Charmeleon,Fire,,405,58,64,58,80,65,80,1,False
      ")

Редактиране: (вижте коментарите)

setDT(df, key=c("Type 1","Type 2"))[, Cluster:=.GRP, by = key(df)][]
person Tonio Liebrand    schedule 23.05.2017
comment
Приех това, защото това може да се групира по група, но мисля, че трябваше да изясня тази част от въпроса: Да предположим, че няма нули в моя набор от данни, как мога да групирам съответно по колоните Тип I и Тип II и след това да групирам по прилика между имената? За да бъде ясно, исках да групирам имената на покемоните след групиране по тип. - person cocanut; 25.05.2017
comment
df[, clu:=rleid(`Type 2`)] е повече от data.table (вашият обект df е data.table) - person jogo; 25.05.2017
comment
stackoverflow.com/questions/32760524/ - person jogo; 25.05.2017
comment
Този отговор ми изглежда грешен. Какво се случва, ако Poison се появи отново в данните? Ще бъде класифициран като нова група. Предполагам, че търсят .GRP. - person David Arenburg; 25.05.2017
comment
разгледах пълните данни. прав си, наистина се появява отново за някои видове. Моя грешка. Направих редакция. Благодаря за забележката. - person Tonio Liebrand; 26.05.2017

Можем да използваме base R

df$cluster <- with(df, match(`Type II`, unique(`Type II`)))
person akrun    schedule 23.05.2017