Слияние трех факторов, чтобы их зависимые переменные суммы в R - PullRequest
0 голосов
/ 26 сентября 2018

Не уверен, что кто-то ответил на это - я искал, но пока у меня ничего не получалось.У меня есть очень большой набор данных, который я пытаюсь сузить.Мне нужно объединить три фактора в моей "PROG" переменной ("Grad.2","Grad.3","Grad.H"), чтобы они стали единой переменной ("Grad"), где зависимая переменная ("NUMBER") каждого сопоставимого набора значений суммируется.

ie.

YEAR = "92/93"    AGE = "20-24"   PROG = "Grad.2"   NUMBER = "50"

YEAR = "92/93"    AGE = "20-24"   PROG = "Grad.3"   NUMBER = "25"

YEAR = "92/93"    AGE = "20-24"   PROG = "Grad.H"   NUMBER = "2"

превращается в

YEAR = "92/93"    AGE = "20-24"   PROG = "Grad"   NUMBER = "77"

Затем я хочу отбросить все остальные факторы для PROG, чтобы я мог сравнивать показатели регистрации для Grad, не беспокоясь о другихфакторы (с которыми я имею дело отдельно).Таким образом, мои активные независимые переменные YEAR и AGE, в то время как зависимая переменная NUMBER.

Я надеюсь, что это адекватно показывает мои данные:

structure(list
(YEAR = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L), .Label = c("92/93", "93/94", "94/95", "95/96", "96/97", 
    "97/98", "98/99", "99/00", "00/01", "01/02", "02/03", "03/04", 
    "04/05", "05/06", "06/07", "07/08", "08/09", "09/10", "10/11", 
    "11/12", "12/13", "13/14", "14/15", "15/16"), class = "factor"), 
AGE = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L), .Label = c("1-19", 
            "20-24", "25-30", "31-34", "35-39", "40+", "NR", "T.Age"), class = c("ordered", 
            "factor")), 
PROG = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                19L, 19L, 19L), .Label = c("T.Prog", "Basic", "Career", "Grad.H", 
                "Grad2", "Grad3", "Grad2.Qual", "Grad3.Qual", "Health.Res", 
                "NoProg.Grad", "NoProg.Other", "NoProg.Und.Grad", "NoProg.NoCred", 
                "Other", "Post.Und.Grad", "Post.Career", "Pre-U", "Career.Qual", 
                "Und.Grad", "Und.Grad.Qual"), class = "factor"), 
NUMBER = c(104997L, 
                347235L, 112644L, 38838L, 35949L, 50598L, 5484L, 104991L, 
                333807L, 76692L)), row.names = c(7936L, 7948L, 7960L, 7972L, 
            7984L, 7996L, 8008L, 10459L, 10471L, 10483L), class = "data.frame")

С точки зрения почемуЯ использую факторы, я не знаю, как еще я должен ввести данные.Факторы имели смысл, и именно так R интерпретировал необработанные данные, когда я их загружал.

Я работаю над предложениями ниже.Пока не удалось, но я все еще учусь тому, как заставить R делать то, что я хочу, и часто путаюсь.Буду отвечать каждому из вас, как только у меня будет разумный ответ.(И как только я перестаю биться бедной головой по столу ... вздыхаю)

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Немного другой подход: выбирайте только те факторы, которые вам нужны, отбрасывайте факторную переменную (потому что вы хотите рассматривать их как группу) и суммируйте все значения NUMBER, группируя по всем другим переменным.df это ваши данные.

aggregate(formula = NUMBER ~ .,
          data = subset(df, PROG %in% c("Grad2", "Grad3", "Grad.H"), select = -PROG),
          FUN = sum)
0 голосов
/ 26 сентября 2018

Есть несколько способов сделать это, но я согласен с FScott, что вы, вероятно, ищете функцию levels () для переименования уровней факторов.Вот как я бы сделал второй шаг суммирования.

library(magrittr)
library(dplyr)

#do the renaming of the PROG variables here

#sum by PROG
df <- df %>%
   group_by(PROG) %>%  # you could add more variable names here to group by i.e. group_by(PROG, AGE, YEAR)
   mutate(group.sum= sum(NUMBER))

Этот блок создаст новый столбец в df с именем group.sum с суммой между подмножествами групп, определенной функцией group_by()

если вы хотите еще больше сжать data.frame, где отдельные значения в NUMBER заменяются на group.sum, опять же есть много способов сделать это, но здесь есть простой способ.

#condense df down
df$number <- df$group.sum
df <- df[,-ncol(df)]
df <- unique(df)

Дополнительное примечание: я бы не советовал делать вышеуказанный фрагмент, потому что вы теряете информацию в ваших данных, и ваши данные более аккуратны, просто имея дополнительный столбец group.sum

0 голосов
/ 26 сентября 2018

Если я правильно понимаю ваш вопрос, это должно сделать это.Я предполагаю, что ваш фрейм данных называется df:

library(tidyverse)

df %>%
mutate(PROG = ifelse(PROG %in% c("Grad2", "Grad3","Grad.H"), 
                     "Grad",
                     NA)) %>% ##combines the 3 Grad variables into one
filter(!is.na(PROG)) %>%     ##drops the other variables
group_by(YEAR, AGE) %>%      
summarise(NUMBER = sum(NUMBER)) 
0 голосов
/ 26 сентября 2018

Я думаю, что вам нужна функция level ().Из руководства:

## combine some levels
z <- gl(3, 2, 12, labels = c("apple", "salad", "orange"))
z
levels(z) <- c("fruit", "veg", "fruit")
z

Я назвал ваши данные временными и запустил этот код.У меня это работает.

z<-gl(n=length(temp$PROG),k=2,labels=c("T.Prog", "Basic", "Career", "Grad.H", 
            "Grad2", "Grad3", "Grad2.Qual", "Grad3.Qual", "Health.Res", 
            "NoProg.Grad", "NoProg.Other", "NoProg.Und.Grad", "NoProg.NoCred", 
            "Other", "Post.Und.Grad", "Post.Career", "Pre-U", "Career.Qual", 
            "Und.Grad", "Und.Grad.Qual"))
z
levels(z)<-c(rep("Other",3),rep("Grad",5),rep("Other",12))
z
temp$PROG2<-factor(x=temp$PROG,levels=levels(temp$PROG),labels=z)
temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...