#r #dataframe #binary #combinations #frequency
Вопрос:
У меня есть набор данных, в котором много двоичных переменных. Для простоты иллюстрации приведем уменьшенную версию, содержащую всего 4 переменные:
set.seed(5) my_data<-data.frame("Slept Well"=sample(c(0,1),10,TRUE), "Had Breakfast"=sample(c(0,1),10,TRUE), "Worked out"=sample(c(0,1),10,TRUE), "Meditated"=sample(c(0,1),10,TRUE))
В приведенном выше примере каждая строка соответствует наблюдению. Меня интересует анализ частоты каждой уникальной комбинации переменных. Например, сколько наблюдений показало, что они оба хорошо спали и медитировали, но не завтракали и не занимались спортом?
Я хотел бы иметь возможность ранжировать уникальные комбинации от наиболее часто встречающихся до наименее часто встречающихся. Каков наилучший способ кодирования этого?
Ответ №1:
Вы можете использовать aggregate
.
x <- aggregate(list(n=rep(1, nrow(my_data))), my_data, length) #x <- aggregate(list(n=my_data[,1]), my_data, length) #Alternative x[order(-x$n),] # Slept.Well Had.Breakfast Worked.out Meditated n #4 0 1 1 0 2 #1 0 0 0 0 1 #2 1 1 0 0 1 #3 0 0 1 0 1 #5 0 0 0 1 1 #6 1 0 0 1 1 #7 0 1 0 1 1 #8 0 0 1 1 1 #9 0 1 1 1 1
Ответ №2:
Как насчет dplyr
решения проблемы:
library(dplyr) my_data %>% # group it group_by_all() %>% # frequencies summarise(freq = n()) %>% # order decreasing arrange(-freq) # A tibble: 9 x 5 Slept.Well Had.Breakfast Worked.out Meditated freq <chr> <chr> <chr> <chr> <int> 1 0 1 1 0 2 2 0 0 0 0 1 3 0 0 0 1 1 4 0 0 1 0 1 5 0 0 1 1 1 6 0 1 0 1 1 7 0 1 1 1 1 8 1 0 0 1 1 9 1 1 0 0 1
Или с data.table
:
res <- setorder(data.table(my_data)[,"."(freq = .N), by = names(my_data)],-freq) res Slept.Well Had.Breakfast Worked.out Meditated freq 1: 0 1 1 0 2 2: 1 0 0 1 1 3: 0 0 1 0 1 4: 0 0 0 0 1 5: 0 1 0 1 1 6: 0 1 1 1 1 7: 0 0 1 1 1 8: 0 0 0 1 1 9: 1 1 0 0 1