Кластеризация по группам

Как выполнить кластеризацию по группам? Например, возьмем этот набор данных о покемонах на 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