2016-05-14 8 views
1

Ich habe versucht, eine Tabelle zu erstellen, die die Anzahl der Faktorstufen um einen anderen Faktor anzeigt. Dazu habe ich Dutzende von Seiten, Fragen ... untersucht, die versuchen, Funktionen in einigen Paketen (dplyr, reshape) zu verwenden, um die Arbeit zu erledigen, ohne Erfolg bei der korrekten Verwendung.Aggregationsfaktor-Zählerstände - nach Faktor

Das ist, was ich habe:

# my data: 
var1 <- c("red","blue","red","blue","red","red","red","red","red","red","red","red","blue","red","blue") 
var2 <- c("0","1","0","0","0","0","0","0","0","0","1","0","0","0","0") 
var3 <- c("2","2","1","1","1","3","1","2","1","1","3","1","1","2","1") 
var4 <- c("0","1","0","0","0","0","1","0","1","1","0","1","0","1","1") 
mydata <- data.frame(var1,var2,var3,var4) 
head(mydata) 

Versuch n + 1: zeigt nur die Gesamtzahl von Faktoren durch einen anderen Faktor.

t(aggregate(. ~ var1, mydata, sum)) 

     [,1] [,2] 
var1 "blue" "red" 
var2 " 5" "12" 
var3 " 5" "18" 
var4 " 6" "16" 

Versuch n + 2: es ist das richtige Format, aber ich konnte es nicht mehr als einen Faktor bekommen.

library(dplyr) 
data1 <- ddply(mydata, c("var1", "var3"), summarise, 
      N = length(var1)) 
library(reshape) 
df1 <- cast(data1, var1 ~ var3, sum) 
df1 <- t(df1) 
df1 

    blue red 
1 3 6 
2 1 3 
3 0 2 

Was würde Ich mag ist:

 blue red 
var2.0 3 10 
var2.1 1 1 
var3.1 3 6 
var3.2 1 3 
var3.3 0 2 
var4.0 2 6 
var4.1 2 5 

Wie kann ich dieses Format zu bekommen? So vielen Dank im Voraus,

+1

yep, bearbeitet. Vielen Dank! – Mareviv

Antwort

3

Wir den Datensatz von ‚var1‘ melt und dann verwenden table

library(reshape2) 
tbl <- table(transform(melt(mydata, id.var="var1"), 
     varN = paste(variable, value, sep="."))[c(4,1)]) 
names(dimnames(tbl)) <- NULL 
tbl 
# 
#   blue red 
# var2.0 3 10 
# var2.1 1 1 
# var3.1 3 6 
# var3.2 1 3 
# var3.3 0 2 
# var4.0 2 6 
# var4.1 2 5 

Oder mit dplyr/tidyr wandeln wir den Datensatz aus ‚breit‘ zu ‚langen‘ Format mit gather, dann unite die Spalten ('var', 'val') zu erstellen 'varV', erhalten die Häufigkeit (tally) nach der Gruppierung von 'var1' und 'varV', und dann spread zu 'Wide' Format.

library(dplyr) 
library(tidyr) 
gather(mydata, var, val, -var1) %>% 
      unite(varV,var, val, sep=".") %>% 
      group_by(var1, varV) %>% 
      tally() %>% 
      spread(var1, n, fill = 0) 
# varV blue red 
# <chr> <dbl> <dbl> 
#1 var2.0  3 10 
#2 var2.1  1  1 
#3 var3.1  3  6 
#4 var3.2  1  3 
#5 var3.3  0  2 
#6 var4.0  2  6 
#7 var4.1  2  5 
+0

Absolut brilliant! Insbesondere gibt die zweite Methode genau das, was ich brauche. Es dauert mich zu verstehen, wie Sie Pipes verwenden, um den data.frame zu füllen. Ich muss wirklich lernen, dies für mich selbst zu machen, vielen Dank für deine Erklärung! – Mareviv