Разделение данных на основе диапазонов в R

Я хотел бы знать, как разделить тему на 4 разных диапазона/уровня. Каждый уровень имеет определенный диапазон. Ниже приведены данные.

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

Четыре диапазона ковшей следующие. ‹=35, 35-50, 50-75, >75

Ожидаемый результат:

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. Значения диапазонов представляют собой процент учащихся, набравших баллы в этом диапазоне.

заранее спасибо


person Ram    schedule 05.04.2016    source источник
comment
Было бы хорошо иметь код для воспроизведения используемых данных.   -  person m-dz    schedule 05.04.2016
comment
@MD сами данные являются необработанными.   -  person Ram    schedule 05.04.2016


Ответы (2)


Возможное решение 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)
person m-dz    schedule 05.04.2016
comment
Спасибо за решение, но если у меня 500 записей, как это, трудно жестко закодировать в data.table, можно было бы импортировать файл, пробовал использовать dat‹-read.csv(file.choose()), но это не получилось, подскажите как быть? - person Ram; 05.04.2016
comment
В приведенном выше коде предполагается, что используется data.table, поэтому либо выполните as.data.table(yourObject), либо используйте функцию fread() из пакета data.table. - person m-dz; 05.04.2016
comment
Большой! Синтаксис data.table на первый взгляд может показаться немного странным, но не пугайтесь! - person m-dz; 07.04.2016
comment
из приведенного выше кода он также включает 35,50,75,100 в диапазоне, я пробовал с [0,35), [35,50), [50,75), [75,100], но он отображается как 0 - person Ram; 15.04.2016
comment
С помощью "[0,35]", "(35,50]" и т. д. вы выбираете только определенные значения PCTs, чтобы изменить конечные точки, которые вы хотите включить, и которые исключают параметры проверки функций cut(), т. е. используйте ?cut в консоли R. - person m-dz; 15.04.2016
comment
Не подскажете, как поменять в крое, пробовал пару усилий, но тщетно - person Ram; 15.04.2016
comment
Один из аргументов cut называется right, и это logical, indicating if the intervals should be closed on the right (and open on the left) or vice versa.. - person m-dz; 15.04.2016
comment
Понял. Спасибо @M.D. - person Ram; 15.04.2016
comment
Конечно, никаких проблем. - person m-dz; 15.04.2016

Это должно работать, может быть, немного больше работы для форматирования:

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)
person Dave2e    schedule 05.04.2016
comment
Спасибо за ответ. Здесь, поскольку std одинаков во всех записях, по которым он показывает группу, что делать, если стандарты разные, куда включать предложение by в коде? - person Ram; 13.04.2016