2016-03-30 28 views
-1

Ich habe dies:Frequenztabelle mit dplyr in r

set.seed(123) 
class = c("A", "B", "C", "D") 
have <- data.frame(ID = c(1:12), CLUSTER = rep(1:4, 3), VAL = sample(class, 12, replace = TRUE)) 

Ich möchte dies:

want <- data.frame(CLUSTER = c(1,2,3,4), D = c(2, 2, 0, 2), C = c(0, 1, 0, 0), A = c(1, 0, 2, 0), B = c(0, 0, 1, 1)) 

Ich möchte dies mit dplyr tun, da es andere Spalten in meiner ursprünglichen Daten, die ich will zusammenfassen.

Ich war auf der Suche nach so etwas wie:

have %>% group_by(CLUSTER) %>% table(VAL) %>% summarize(sum(OTHER_VARS)) %>% mutate(OTHER_VARS) 

ich weiß, ich table oder xtabs oder count in dplyr verwenden kann, aber es entweder verliert den Datenrahmenklasse oder Daten konvertiert zu lange statt breit.

danke.

+0

Bitte verwenden Sie 'set.seed (x)' zuerst bei der Verwendung von 'sample' - sonst Ihre' have' und 'want' nicht reproduzierbar sind. Kannst du bitte bearbeiten? (Und nein, ich bin nicht der Downvoter) – thelatemail

+0

Überprüfen Sie Ihre Ausgabe. Es passt nicht zu der Eingabe –

Antwort

0

Ich vermute, es gibt eine Möglichkeit, dies mit dplyr zu behandeln, aber hier ist eine Lösung mit reshape2.

library(reshape2) 
set.seed(123) 

class <- c("A", "B", "C", "D") 
have <- data.frame(ID = c(1:12), 
        CLUSTER = rep(1:4, 3), 
        VAL = sample(class, 12, replace = TRUE)) 

dcast(have, CLUSTER ~ VAL) 

Ich glaube, das tut, was Sie im Sinn haben; dcast() gibt ein Objekt data.frame zurück. Aber noch einmal, dplyr kann wahrscheinlich leicht damit umgehen.

0

Nicht, dass es etwas falsch mit dplyr, aber ich denke, SieFormal konnte Verwendung table eine data.frame Lösung zu erhalten:

> t1 <- table(have$CLUSTER, have$VAL) #create using table() 

    A B C D 
    1 0 1 1 1 
    2 1 1 0 1 
    3 0 1 1 1 
    4 0 1 0 2 

> t1 <- data.frame(t1) #convert to data.frame 

    Var1 Var2 Freq 
1  1 A 0 
2  2 A 1 
     ..... 
15 3 D 1 
16 4 D 2 

> t1 <- reshape(t1, idvar = 'Var1', timevar = 'Var2', direction = 'wide') #convert to wide 

     Var1 Freq.A Freq.B Freq.C Freq.D 
1 1  0  1  1  1 
2 2  1  1  0  1 
3 3  0  1  1  1 
4 4  0  1  0  2 

> names(t1) <- c('CLUSTER', levels(have$VAL)) #rename columns 

    CLUSTER A B C D 
1  1 0 1 1 1 
2  2 1 1 0 1 
3  3 0 1 1 1 
4  4 0 1 0 2 

Edit: Eine prägnante Lösung ohne dplyr (dank @thelatemail):

t1 <- table(have$CLUSTER, have$VAL) 
cbind(CLUSTER = rownames(t1), as.data.frame.matrix(t1)) 
+1

'as.data.frame.matrix (t1)' könnte für Sie von Interesse sein. – thelatemail

+0

Würde das die CLUSTER-Spalte nicht "loswerden"? – bouncyball

+1

Sie könnten sie ziemlich schnell zurück bekommen - 't1 <- Tabelle (haben $ CLUSTER, haben $ VAL); cbind (CLUSTER = rownames (t1), as.data.frame.matrix (t1)) ' – thelatemail

Verwandte Themen