2016-04-05 2 views
0

Je voudrais savoir comment diviser le sujet en 4 plages/niveaux différents. Chaque niveau a une certaine plage. Voici les données.Diviser les données en fonction des plages de R

Std Name Subject Percentage 
    2 Vinay eng  50 
    2 Vinay math  60 
    2 Vinay hindi 70 
    2 Rohan eng  70 
    2 vas  mat  50 
    2 dheer eng  35 
    2 dheer math  90 
    2 dheer hindi 80 
    2 Bhas eng  90 
    2 Bhas math  35 
    2 Bhas hindi 50 

Les quatre plages de godets sont les suivantes. < = 35, 35-50, 50-75,> 75

Résultats attendus:

Std Subject 0-35 35-50 50-75 >75 
2 Eng  25% 25% 25% 25% 
2 Mat  25% 25% 25% 25% 
2 Hin  0% 25% 25% 25% 

P.s Les valeurs des gammes sont pourcentage d'élèves reçu dans cette gamme.

Merci à l'avance

+0

serait bon d'avoir un code pour reproduire les données utilisées. –

+0

@ M.D les données elles-mêmes sont des données brutes. – Ram

Répondre

0

Une solution possible data.table:

library(data.table) 

dat <- data.table(Std = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
        Name = c("Vinay", "Vinay", "Vinay", "Rohan", "vas", "dheer", "dheer", "dheer", "Bhas", "Bhas", "Bhas"), 
        Subject = c("eng", "math", "hindi", "eng", "mat", "eng", "math", "hindi", "eng", "math", "hindi"), 
        Percentage = c(50L, 60L, 70L, 70L, 50L, 35L, 90L, 80L, 90L, 35L, 50L)) 

dat[, PCTs := cut(Percentage, 
        breaks = c(0, 35, 50, 75, 100), 
        include.lowest = TRUE)] 

res <- dat[, list(
       "0-35" = sum(PCTs == "[0,35]")/.N * 100, 
       "35-50" = sum(PCTs == "(35,50]")/.N * 100, 
       "50-75" = sum(PCTs == "(50,75]")/.N * 100, 
       ">75" = sum(PCTs == "(75,100]")/.N * 100 
      ), 
      by = c("Std", "Subject")] 

print(res, digits = 2) 
+0

Merci pour la solution, Mais si j'ai 500 enregistrements comme ceci, Il est difficile de coder en dur dans le data.table, Importer un fichier serait l'option, essayé en utilisant dat <-read.csv (file.choose()), Mais cela n'a pas fonctionné, pourriez-vous s'il vous plaît dites-moi comment faire? – Ram

+0

Le code ci-dessus suppose qu'un 'data.table' est utilisé, donc faites soit' as.data.table (yourObject) 'ou utilisez la fonction' fread() 'du paquet' data.table'. –

+0

Merci @ M.D, Il a travaillé – Ram

0

Cela devrait fonctionner, peut-être un peu plus de travail pour le formattage:

df<-read.table(header = TRUE, sep=",", text="Std, Name, Subject, Percentage 
       2, Vinay,eng,  50 
       2, Vinay,math,  60 
       2, Vinay,hindi, 70 
       2, Rohan,eng,  70 
       2, vas,math,  50 
       2, dheer,eng,  35 
       2, dheer,math, 90 
       2, dheer,hindi, 80 
       2, Bhas,eng,  90 
       2, Bhas,math,  35 
       2, Bhas,hindi, 50") 

breaks<-c(0, 35, 50, 75, 100) 
t<-table(df$Subject, responseName=cut(df$Percentage, breaks = breaks)) 
format(t/rowSums(t), digits=3) 
+0

Merci pour la réponse, Ici puisque le std est identique dans tous les enregistrements, il montre le groupe par, Et si les normes sont différentes où inclure par clause dans le code? – Ram