2017-10-19 3 views
-3

Ich arbeite derzeit mit einem Datensatz, wo Kredite mit einem Zweck für das Darlehen und eine damit verbundene Kreditqualität für jeden Kredit angezeigt werden.Gruppe paarweise Kategorien zusammen

Der Datensatz aufgerufen wird loancase und eine der Säulen ist die Zweck, während eine andere Spalte Klasse ist. enter image description here

Unten habe ich die Matrix, die paarweise mit Proportionen gefüllt werden soll. Jede Zeile sollte zu 100 Prozent bedeuten, dass jeder Eintrag der Anteil für den bestimmten Zweck ist, der diese Note erhalten hat. Zum Beispiel kann die Zeile für [Auto,] wie 20, 20, 0, 0, 20, 0, 40 aussehen.

Beachten Sie, dass der aktuelle Datenplatzhalter NA ist und ich versuche, das durch eine ersetzen Vektor, der jeden gewünschten Eintrag auflistet.

matrix(data = NA, nrow = 14, ncol = 7, dimnames = list(levels(loancase$purpose), levels(loancase$grade))) 

enter image description here

Wie erreiche ich dieses Ziel mit dem gewünschten Wert in jedem Eintrag Füllung? Ich denke zurzeit, dass ich tapply() verwende, aber weiß nicht, wie man das erreicht. Hier ist der aktuelle Code, der an die Stelle von "NA" tritt, aber es ist jetzt nicht korrekt.

grades.per.purpose = tapply(loancase$grade, levels(loancase$purpose), sum) 
+3

Bitte geben Sie Daten als Nur-Text, nicht Bilder, so dass Benutzer kopieren/einfügen können. – neilfws

+0

Zusätzliche relevante Codezeilen – user1713336

Antwort

1

Da Sie nicht verwertbare Daten liefern habe, werde ich ein Spielzeug Beispiel bilden:

df = read.table(text = "grade purpose amount 
      A Car 100 
      B Car 200 
      C Car 100 
      A Moving 200 
      B Moving 50 
      B Moving 50", header = TRUE) 

Wir Car Darlehen sind 50% B-Grade, 25% A- zeigen wollen und C-Klasse. Und Moving Darlehen sind 67% A-Klasse, 33% B-Klasse.

Ich mag dplyr Bibliothek für diese Art der Gruppierung nutzen und zusammenfassend:

library(dplyr) 
x = df %>% 
    group_by(purpose) %>% 
    mutate(purpose.total = sum(amount)) %>% 
    group_by(purpose, grade) %>% 
    summarise(percent = sum(amount/purpose.total)) 

Das Ergebnis:

purpose grade percent 
1  Car  A 0.2500000 
2  Car  B 0.5000000 
3  Car  C 0.2500000 
4 Moving  A 0.6666667 
5 Moving  B 0.3333333 

Zur Gruppe in ein Quadrat wie Sie gefragt, versuchen Sie die tidyr Bibliothek :

tidyr::spread(x, key = grade, value = percent, fill = 0) 

Ergebnis:

purpose   A   B  C 
1  Car 0.2500000 0.5000000 0.25 
2 Moving 0.6666667 0.3333333 0.00  
+0

Dies ist die genaue Art von Ergebnis, das ich versuche zu erreichen, danke. Leider kann ich für diese Zwecke keine externen Bibliotheken verwenden. Gibt es eine Möglichkeit, dies mit nativen R-Funktionen zu tun? – user1713336

+0

@ user1713336 R ist viel einfacher zu verwenden, wenn externe Bibliotheken erlaubt sind. Sind Sie sicher, dass Sie keine Pakete bekommen können? – lebelinoz

+0

Ich würde gerne Bibliotheken verwenden, aber ich bin davon ausgeschlossen, sie für dieses Projekt zu verwenden. – user1713336

1

Obwohl ich, dass es Unsinn glauben Pakete werden verboten zu verwenden, gibt es eine base R Lösung, mit dem Endergebnis in einer Weise präsentiert, die die OP bitte könnten.

xt <- xtabs(amount ~ grade + purpose, df) 
t(xt)/colSums(xt) 
+0

Brilliant! Du hast mich inspiriert, mehr Base R zu lernen! – lebelinoz