2017-01-04 6 views
2

Следуя this question и this one, я задавался вопросом, что было лучшим вариантом для обобщения категориальных переменных в одном наборе данных.Резюме нескольких столбцов с dplyr - категориальная версия

У меня есть набор данных, таких как

# A tibble: 10 <U+00D7> 4 
    empstat_couple  nssec7_couple3 nchild07 age_couple 
       <chr>    <fctr> <fctr>  <dbl> 
1   Neo-Trad Lower Managerial 1child   39 
2   Neo-Trad Higher Managerial 1child   31 
3   Neo-Trad Manual and Routine 1child   33 
4    Trad Higher Managerial 1child   43 

В первые 3 переменные являются категоричны (символ или фактор) и последний численное.

То, что я хотел бы что-то вроде (выход)

    var n p 
1:   Neo-Trad 6 0.6 
2: OtherArrangment 2 0.2 
3:    Trad 2 0.2 
4: Higher Managerial 4 0.4 
5: Lower Managerial 5 0.5 
6: Manual and Routine 1 0.1 
7:    1child 9 0.9 
8:   2children 1 0.1 

Ну для числовой переменной, я не уверен, как добавить его по значению к резюме.

Я думаю, самый основной способ пойти

library(dplyr) 
library(data.table) 

a = count(dt, empstat_couple) %>% mutate(p = n/sum(n)) 
b = count(dt, nssec7_couple3) %>% mutate(p = n/sum(n)) 
c = count(dt, nchild07) %>% mutate(p = n/sum(n)) 

rbindlist(list(a,b,c)) 

Интересно, существовал summarise_each решение?

Это не работает

dt %>% summarise_each(funs(count)) 

apply Использование я мог придумать этот

apply(dt, 2, as.data.frame(table)) %>% rbindlist() 

Но это не здорово.

Любые предложения?

данные

dt = structure(list(empstat_couple = c("Neo-Trad", "Neo-Trad", "Neo-Trad", 
"Trad", "OtherArrangment", "Neo-Trad", "Trad", "OtherArrangment", 
"Neo-Trad", "Neo-Trad"), nssec7_couple3 = structure(c(2L, 1L, 
4L, 1L, 2L, 2L, 1L, 2L, 1L, 2L), .Label = c("Higher Managerial", 
"Lower Managerial", "Intermediate", "Manual and Routine"), class = "factor"), 
nchild07 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
1L), .Label = c("1child", "2children", ">2children"), class = "factor"), 
age_couple = c(39, 31, 33, 43, 32, 28, 28, 40, 33, 26), hldid = 1:10), .Names = c("empstat_couple", 
"nssec7_couple3", "nchild07", "age_couple", "hldid"), row.names = c(NA, 
-10L), class = "data.frame") 
+0

Что касается расчета «р», правильно? – akrun

+0

@akrun Я так думаю. Это просто пропорция. – giacomo

ответ

3

Мы можем melt с data.table и получить .N и доля

library(data.table) 
unique(melt(setDT(dt), id.var = "age_couple")[, n := .N , value], 
     by = c("variable", "value", "n"))[, p := n/sum(n), variable 
     ][, c("age_couple", "variable") := NULL][] 

Или с помощью dplyr/tidyr

library(dplyr) 
library(tidyr) 
gather(dt, var1, var, -age_couple) %>% 
      group_by(var) %>% 
      mutate(n = n()) %>% 
      select(-age_couple) %>% 
      unique() %>% 
      group_by(var1) %>% 
      mutate(p= n/sum(n)) %>% 
      ungroup() %>% 
      select(-var1) 
+0

очень аккуратный. Мне нравится решение 'data.table'. Я могу использовать свой персональный идентификатор пары как id.var. Работает хорошо. спасибо – giacomo

+0

однако, ваш 'p' не дает мне правильных результатов, я думаю. – giacomo

+0

@giacomoV Я изменил первое решение, пожалуйста, проверьте, что это то, что вы хотели, я изменил второй также – akrun

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

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