2017-01-31 12 views
2

Люди, мне нужен элегантный способ создания частоты и группы по нескольким переменным. Вывод должен быть кадром данных. Я знаю, что ответ лежит где-то в использовании dplyr и data.table, который я все еще изучаю. Я пробовал это link, но я хочу сделать это с помощью dplyr и data.table.Таблица частот и группа по нескольким переменным в r

Вот выборочные данные из одной и той же ссылке -

ID <- seq(1:177) 
Age <- sample(c("0-15", "16-29", "30-44", "45-64", "65+"), 177, replace = TRUE) 
Sex <- sample(c("Male", "Female"), 177, replace = TRUE) 
Country <- sample(c("England", "Wales", "Scotland", "N. Ireland"), 177, replace = TRUE) 
Health <- sample(c("Poor", "Average", "Good"), 177, replace = TRUE) 
Survey <- data.frame(Age, Sex, Country, Health) 

Вот результат я ищу. Спасибо и оцените вашу помощь!

enter image description here

+0

Я также прекрасно разбираюсь в том, что у меня нет общего количества данных, но я не хочу вводить фактические уровни факторов как часть кода, поскольку akrun предлагает - «[, Total: = Average + Good + Poor] [] " – Jennifer

+0

' library (tidyverse); Опрос%>% count (возраст, пол, здоровье)%>% спрэд (здоровье, n, fill = 0) ' – alistaire

+0

Спасибо alistaire ... tidyverse кажется приятным! .... делает ли он также возможным подсчет, средний и сумма как вы это делали в «распространении (здоровье, ....)», указав n? – Jennifer

ответ

3

Мы можем использовать dcast из data.table

library(data.table) 
dcast(setDT(Survey), Age + Sex ~Health, value.var = "Country", 
        length)[, Total := Average + Good + Poor][] 

Если мы не хотим, чтобы ввести имена столбцов, используйте Reduce с +

dcast(setDT(Survey), Age + Sex ~Health, value.var = "Country", 
       length)[, Total := Reduce(`+`, .SD), .SDcols = Average:Poor][] 
+0

Спасибо akrun ... Есть ли способ не вводить уровни факторов в коде? Я в порядке с отсутствием большого количества данных на выходе dataframe. Извините за беспокойство и оцените ваш быстрый ответ! – Jennifer

+0

@Jennifer Обновлено сообщение – akrun

+0

Спасибо akrun ... – Jennifer

1

Здесь есть метод с использованием data.table и tidyr, но не dcast. Во-первых, вы считаете наблюдения с .N в j переменными интереса

Survey[, .N, by=.(Age, Sex, Health)]

возвращения:

Age Sex  Health N 
30-44 Female Average 10 
65+ Female Poor  9 
0-15 Male Average 3 
16-29 Male Average 6 
30-44 Male Good  6 
45-64 Female Average 8 

Затем используйте spread из tidyr превратить вашу колонку выбора в набор новых столбцов (по одному для каждого уникального значения), заполненному N

spread(Survey[, .N, by=.(Age, Sex, Health)], Health, N)

+0

Спасибо moman82 ... узнал что-то новое от всех вас. – Jennifer

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

  • Нет связанных вопросов^_^