2016-02-05 6 views
1

Я импортировал данные интервью из файла SPSS .SAV как data.frame, и теперь я пытаюсь создать частотную таблицу на основе номера вопроса и места опроса. Вот пример data.frame:R Таблица частот из нескольких категориальных переменных

loc<-c("city1","city2","city1","city2","city1","city1","city2","city2","city1","city2") 
q1<-c("YES","YES","NO","MAYBE","NO","NO","YES","NO","MAYBE","MAYBE") 
q2<-c("YES","NO","MAYBE","YES","NO","MAYBE","MAYBE","YES","YES","NO") 
q3<-c("NO","NO","NO","NO","YES","YES","MAYBE","MAYBE","NO","MAYBE") 
df<-data.frame(loc,q1,q2,q3) 

df 
    loc q1 q2 q3 
1 city1 YES YES NO 
2 city2 YES NO NO 
3 city1 NO MAYBE NO 
4 city2 MAYBE YES NO 
5 city1 NO NO YES 
6 city1 NO MAYBE YES 
7 city2 YES MAYBE MAYBE 
8 city2 NO YES MAYBE 
9 city1 MAYBE YES NO 
10 city2 MAYBE NO MAYBE 

Теперь я хотел бы подсчитать количество появлений для каждого варианта ответа "YES","NO","MAYBE" в соответствии с вопросительным номером "q1","q2","q3" и расположение "city1","city". Полученный data.frame должен выглядеть следующим образом:

loc quest answ freq 
1 city1 q1 YES 1 
2 city1 q1 NO 3 
3 city1 q1 MAYBE 1 
4 city2 q1 YES 2 
5 city2 q1 NO 1 
6 city2 q1 MAYBE 2 
7 city1 q2 YES 2 
8 city1 q2 NO 1 
9 city1 q2 MAYBE 2 
10 city2 q2 YES 2 
11 city2 q2 NO 2 
12 city2 q2 MAYBE 1 
13 city1 q3 YES 2 
14 city1 q3 NO 3 
15 city1 q3 MAYBE 0 
16 city2 q3 YES 0 
17 city2 q3 NO 2 
18 city2 q3 MAYBE 3 

До сих пор я играл с count(), ddply() и summarise() из plyr пакета не повезло. Мое текущее решение действительно хакерское и включает в себя разделение df на loc, создавая частотную таблицу с as.data.frame(summary(df_city1)), извлекая частоту из сводной строки и объединяя сводку data.frame s от city1 и city2 обратно вместе. Я предполагаю, что должно быть более легкое/более элегантное решение.

ответ

2

Превратим набор данных из «широкий» на «длинные» (gather делает это), то group_by) «LOC», «Квест», «отве», и использовать tally, чтобы получить количество. Но, если мы ищем комбинации, которые не найдены в наборе данных, чтобы иметь счет 0, тогда нам может понадобиться присоединиться к набору данных, содержащему все комбинации из трех столбцов (и unique).

library(dplyr) 
library(tidyr) 
dfN <- gather(df, quest, answ, q1:q3) %>% 
        complete(loc, quest, answ) %>% 
        unique() 

res <- gather(df, quest, answ, q1:q3) %>% 
       group_by(loc, quest, answ) %>% 
       tally() %>% 
       left_join(dfN, .) %>% 
       mutate(n = ifelse(is.na(n), 0, n)) 
res 
#  loc quest answ  n 
# (fctr) (chr) (chr) (dbl) 
#1 city1 q1 MAYBE  1 
#2 city1 q1 NO  3 
#3 city1 q1 YES  1 
#4 city1 q2 MAYBE  2 
#5 city1 q2 NO  1 
#6 city1 q2 YES  2 
#7 city1 q3 MAYBE  0 
#8 city1 q3 NO  3 
#9 city1 q3 YES  2 
#10 city2 q1 MAYBE  2 
#11 city2 q1 NO  1 
#12 city2 q1 YES  2 
#13 city2 q2 MAYBE  1 
#14 city2 q2 NO  2 
#15 city2 q2 YES  2 
#16 city2 q3 MAYBE  3 
#17 city2 q3 NO  2 
#18 city2 q3 YES  0 
+0

Спасибо @akrun, однако ваше решение не дает ожидаемого результата. Теперь для каждого подсчета дополнительная строка защищена до «res». –

+0

@viktor_r Я забыл «уникальный». Теперь он должен работать – akrun