2014-09-17 2 views
6

У меня есть длинный набор данных с одной строкой на каждого человека, сгруппированного по школам. Каждая строка имеет упорядоченный множитель {1, 2, 3, 4}, «кошки». Я хочу получить процент 1, 2, 3 и 4 в каждой школе. Набор данных выглядит следующим образом:dplyr: Подсчет/Процент факторов, сгруппированных по школой, не сгруппированных

school_number   cats 
1   10505    3 
2   10505    3 
3   10502    1 
4   10502    1 
5   10502    2 
6   10502    1 
7   10502    1 
8   10502    2 
10   10503    3 
11   10505    2 

Я пытался что-то вроде этого:

df_pcts <- df %>% 
    group_by(school_number) %>% 
    mutate(total=sum(table(cats))) %>% 
    summarize(cat_pct = table(cats)/total) 

, но общую переменную, полученный на стадии мутируют() помещает великое общее количество строк в каждой строке. Я даже не могу дойти до финального шага. Я смущен.

P.S. В некоторых других постах я видел такие строки:

n = n() 

, когда я делаю, что я получаю сообщение о том,

Error in n() : This function should not be called directly 

Откуда это взялось?

ТИА

+0

, что выход нужно? отдельные столбцы для 1,2,3 кошек или отдельные строки для каждой комбинации школы/кошки? – jalapic

+0

Вы также можете использовать 'df%>% group_by (school_number, cats)%>% summary (n = n())%>% mutate (pct = 100 * n/sum (n))' – akrun

+0

Не могли бы вы ввести просто ' mutate' в ваш сеанс и подтвердите, является ли последняя строка вывода «<среда: namespace: dplyr>»? Если выход - это '<среда: namespace: plyr>', то это именно та проблема: как-то plyr загрузился после загрузки dplyr (и мутация plyr не обращает внимания на group_by). Это обычная причина (хотя и не единственная) проблемы «group_by не работает». –

ответ

9

Возможно, это поможет немного, хотя я не уверен на 100%, что выход вам нужно.

Подсчитывает количество строк каждой комбинации school_number/cats, которые существуют в вашем df, используя tally. Затем вычисляет процент «кошек» в каждом номере school_number, а затем группируется только по номеру школы.

df %>% 
    group_by(school_number,cats) %>% 
    tally %>% 
    group_by(school_number) %>% 
    mutate(pct=(100*n)/sum(n)) 

Это дает это:

# school_number cats n  pct 
    # 1   10502 1 4 66.66667 
    # 2   10502 2 2 33.33333 
    # 3   10503 3 1 100.00000 
    # 4   10505 2 1 33.33333 
    # 5   10505 3 2 66.66667 

EDIT:

добавить в строках с 0%, которые отсутствуют в данном образце, вы можете сделать следующее. Свяжите результат выше с df, который содержит 0% для всех комбинаций school_number/cats. Сохраняйте только первый экземпляр этого связывания (первые экземпляры всегда содержат значения> 0%, если они существуют). Затем я организовал его school_number и кошек для удобства чтения:

y<-df %>% 
    group_by(school_number,cats) %>% 
    tally %>% 
    group_by(school_number) %>% 
    mutate(pct=(100*n)/sum(n)) %>% 
    select(-n) 

x<-data.frame(school_number=rep(unique(df$school_number),each=4), cats=1:4,pct=0) 

rbind(y,x) %>% 
    group_by(school_number,cats)%>% 
    filter(row_number() == 1) %>% 
    arrange(school_number,cats) 

, который дает:

# school_number cats  pct 
#1   10502 1 66.66667 
#2   10502 2 33.33333 
#3   10502 3 0.00000 
#4   10502 4 0.00000 
#5   10503 1 0.00000 
#6   10503 2 0.00000 
#7   10503 3 100.00000 
#8   10503 4 0.00000 
#9   10505 1 0.00000 
#10   10505 2 33.33333 
#11   10505 3 66.66667 
#12   10505 4 0.00000 
0

Все комбинации номера школы и кошек затем оставили присоединиться для того, чтобы вычислить проц. Если NA, то 0

expand.grid(school_number = unique(df$school_number), cats = levels(df$cats)) %>% 
    left_join(df %>% 
       group_by(school_number, cats) %>% 
       tally %>% 
       mutate(pct = (n/sum(n) * 100))) %>% 
    select(-n) %>% 
    mutate(pct = ifelse(is.na(pct), 0, pct)) %>% 
    arrange(school_number) 

который дает

school_number cats  pct 
1   10502 1 66.66667 
2   10502 2 33.33333 
3   10502 3 0.00000 
4   10502 4 0.00000 
5   10503 1 0.00000 
6   10503 2 0.00000 
7   10503 3 100.00000 
8   10503 4 0.00000 
9   10505 1 0.00000 
10   10505 2 33.33333 
11   10505 3 66.66667 
12   10505 4 0.00000 
+1

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http: // meta. stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

Смежные вопросы