2017-10-19 8 views
-3

Je travaille actuellement avec un ensemble de données où les prêts sont affichés avec un but pour le prêt et une note de prêt associée pour chaque prêt.Grouper les catégories par paires ensemble

L'ensemble de données est appelée loancase et l'une des colonnes est le but tandis qu'une autre colonne est qualité. enter image description here

Ci-dessous, j'ai la matrice qui doit être remplie deux fois avec des proportions. Chaque ligne doit totaliser 100%, ce qui signifie que chaque entrée correspond à la proportion correspondant à l'objectif spécifique ayant reçu cette note. Par exemple, la ligne pour [Car,] peut ressembler à 20, 20, 0, 0, 20, 0, 40.

Notez que l'espace réservé pour les données actuelles est NA et j'essaie de le remplacer par un vecteur répertoriant chaque entrée souhaitée.

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

enter image description here

Comment puis-je atteindre cet objectif de remplir chaque entrée avec la valeur désirée? Je pense actuellement que j'utilise tapply() mais je ne sais pas comment y parvenir. Voici le code actuel qui ira à la place de "NA" mais ce n'est pas correct à partir de maintenant.

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

Veuillez fournir les données sous forme de texte brut, pas d'image, afin que les utilisateurs puissent copier/coller. – neilfws

+0

Ajouté lignes pertinentes de code – user1713336

Répondre

1

Puisque vous n'avez pas fourni des données utilisables, je vais faire un exemple de jouet:

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) 

Nous voulons montrer Car prêts sont 50% B-Grade, 25% et A- C-grade. Et Moving prêts sont 67% A-grade, 33% B-grade.

J'aime utiliser dplyr bibliothèque pour ce genre de regroupement et récapitulant:

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

Le résultat:

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 

Pour le groupe dans un carré comme vous avez demandé, essayez la bibliothèque tidyr :

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

Résultat:

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

C'est le type exact de résultat que j'essaye de réaliser merci. Malheureusement, à ces fins, je ne peux utiliser aucune bibliothèque externe. Y at-il un moyen de le faire en utilisant les fonctions R natives? – user1713336

+0

@ user1713336 R est beaucoup plus facile à utiliser si vous êtes autorisé bibliothèques externes. Etes-vous sûr que vous ne pouvez pas obtenir de paquets? – lebelinoz

+0

J'aimerais aussi utiliser des bibliothèques, mais je ne peux pas les utiliser pour ce projet. – user1713336

1

Bien que je crois qu'il est absurde d'être interdit d'utiliser des paquets, il y a une solution base R, avec le résultat final présenté d'une manière qui pourrait plaire à l'OP.

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

Brillant! Tu m'as inspiré pour apprendre plus de base R! – lebelinoz