2016-04-20 10 views
2

Beginnen Sie mit dem Beispieldaten:Halten „Cluster“ nur mit der höchsten Anzahl von Elementen

> dput(data) 
structure(list(Country = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L), .Label = c("France", "Spain"), class = "factor"), 
    Car = structure(c(6L, 17L, 7L, 18L, 4L, 13L, 20L, 5L, 14L, 
    21L, 8L, 11L, 15L, 9L, 12L, 16L, 8L, 11L, 15L, 9L, 12L, 19L, 
    3L, 10L, 1L, 2L), .Label = c("Audi_1_EON", "Audi_2_EON", 
    "Ferrari_1_EOD", "Fiat_1_EOD", "Fiat_1_EON", "Mazda_1_EOD", 
    "Mazda_1_EON", "Mercedes_1_EOD", "Mercedes_1_EON", "Mercedes_2_EOD", 
    "Nexia_1_EOD", "Nexia_1_EON", "Opel_1_EOD", "Opel_1_EON", 
    "Peugeot_1_EOD", "Peugeot_1_EON", "Porsche_2_EOD", "Porsche_2_EON", 
    "Tico_1_EON", "VW_1_EOD", "VW_1_EON"), class = "factor"), 
    ValueOfComp = c(13L, 13L, 13L, 13L, 14L, 14L, 14L, 14L, 14L, 
    14L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 16L, 
    16L, 12L, 12L, 12L, 12L)), .Names = c("Country", "Car", "ValueOfComp" 
), class = "data.frame", row.names = c(NA, -26L)) 

Im vorliegenden data haben wir zwei verschiedene Länder in der ersten Spalte. In der nächsten Spalte können wir die Autos finden, die jedem Land zugeordnet sind und in der letzten Spalte die Nummer des Clusters.

Ich möchte in der Tabelle nur einen einzigen Cluster für jedes Land halten. Es muss der größte Cluster für jedes Land sein. Nehmen wir Frankreich als Beispiel. Zwei Cluster (13 und 14) sind diesem Land zugeordnet. Es ist offensichtlich, dass Cluster 14 mehr Elemente/Autos enthält. In diesem Fall würde ich gerne Cluster 14 behalten und Cluster 13 aus den Daten entfernen.

Die dargestellten Daten sind nur ein Beispiel. Meine realen Daten sind eine massive Tabelle, daher glaube ich, dass es in einigen Fällen vorkommen kann, dass die Cluster die gleiche Anzahl von Elementen enthalten, so dass es nicht darauf ankommt, welche bei den Daten bleiben.

+0

was, wenn es zwei Gruppen von gleicher Größe geschieht? behalte sie beide oder wähle zufällig einen aus? –

+0

Ich habe es im letzten Absatz erwähnt. Wähle zufällig. Das war so einfach für dich :). –

+0

Hier ist ein Ansatz, unter dem standardmäßig die erste Gruppe ausgewählt wird. –

Antwort

2
library(data.table) 

data[ValueOfComp %in% setDT(data)[,rle(ValueOfComp), Country][ 
            ,values[which.max(lengths)], Country]$V1,] 

    Country   Car ValueOfComp 
1: France  Fiat_1_EOD   14 
2: France  Opel_1_EOD   14 
3: France  VW_1_EOD   14 
4: France  Fiat_1_EON   14 
5: France  Opel_1_EON   14 
6: France  VW_1_EON   14 
7: Spain Mercedes_1_EOD   15 
8: Spain Nexia_1_EOD   15 
9: Spain Peugeot_1_EOD   15 
10: Spain Mercedes_1_EON   15 
11: Spain Nexia_1_EON   15 
12: Spain Peugeot_1_EON   15 
2

Mit dplyr könnten Sie tun:

data %>% 
    group_by(Country, ValueOfComp) %>% 
    mutate(size = n()) %>% 
    group_by(Country) %>% 
    filter(size == max(size), ValueOfComp == max(ValueOfComp)) 

Source: local data frame [12 x 4] 
Groups: Country [2] 

    Country   Car ValueOfComp size 
    (fctr)   (fctr)  (int) (int) 
1 France  Fiat_1_EOD   14  6 
2 France  Opel_1_EOD   14  6 
3 France  VW_1_EOD   14  6 
4 France  Fiat_1_EON   14  6 
5 France  Opel_1_EON   14  6 
6 France  VW_1_EON   14  6 
7 Spain Mercedes_1_EOD   16  6 
8 Spain Nexia_1_EOD   16  6 
9 Spain Peugeot_1_EOD   16  6 
10 Spain Mercedes_1_EON   16  6 
11 Spain Nexia_1_EON   16  6 
12 Spain  Tico_1_EON   16  6 
1

Wir verwenden plyr Paket und subset zu bekommen,

ddply(dat, "Country", subset, ValueOfComp == count(ValueOfComp)$x[which.max(count(ValueOfComp)$freq)]) 
# Country   Car ValueOfComp 
#1 France  Fiat_1_EOD   14 
#2 France  Opel_1_EOD   14 
#3 France  VW_1_EOD   14 
#4 France  Fiat_1_EON   14 
#5 France  Opel_1_EON   14 
#6 France  VW_1_EON   14 
#7 Spain Mercedes_1_EOD   15 
#8 Spain Nexia_1_EOD   15 
#9 Spain Peugeot_1_EOD   15 
#10 Spain Mercedes_1_EON   15 
#11 Spain Nexia_1_EON   15 
#12 Spain Peugeot_1_EON   15 
Verwandte Themen