2017-01-04 3 views
2

Nach this question und this one, fragte ich mich, was war die beste Option, kategorische Variablen in einem Datensatz zusammenzufassen.Zusammenfassung mehrere Spalten mit dplyr - kategoriale Version

Ich habe einen Datensatz wie

# 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 

Die 3 ersten Variablen kategorische (Rolle oder Faktor) und die letzten numerischen sind.

Was Ich mag wäre so etwas wie (Ausgang) ist

    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 

Gut gerüstet für die numerische Variable, ich bin nicht sicher, wie es zu der Zusammenfassung nach Bedeutung hinzuzufügen.

ich denke, der einfachste Weg zu gehen

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)) 

Ich fragte mich, ob eine summarise_each Lösung existiert?

funktioniert das nicht

dt %>% summarise_each(funs(count)) 

apply Verwendung von I mit diesem

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

einfiel Aber es ist nicht so toll.

Irgendwelche Vorschläge?

Daten

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

In Bezug auf die Berechnung von 'p', ist es richtig? – akrun

+0

@akrun Ich denke schon. Es ist einfach das Verhältnis. – giacomo

Antwort

3

können wir melt mit data.table und bekommen die .N und Anteil

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][] 

Oder 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) 
mit
+0

sehr ordentlich. Ich mag die 'data.table' Lösung. Ich kann meine persönliche ID als "id.var" verwenden. Funktioniert gut. Danke – giacomo

+0

jedoch, Ihr 'p' gibt mir nicht die richtigen Ergebnisse, denke ich. – giacomo

+0

@giacomoV Ich habe die erste Lösung geändert, Bitte überprüfen Sie, ob das was Sie wollten, ich werde die zweite auch ändern – akrun

Verwandte Themen