2017-01-04 7 views
2

this questionthis oneに続いて、私は1つのデータセットのカテゴリ変数を要約する最良のオプションが何であるか疑問に思った。dplyr - category形式の複数の列の概要

Iは、

# 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 

まあのための数値変数のようなものですが、私は要約を有意義にそれを追加するかどうかはわからないと思います。

私が行くための最も基本的な方法は、summarise_eachソリューションが存在していた場合、私は疑問に思い

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

ですね?

これは私がこの

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

を考え出すことができapplyを使用して

dt %>% summarise_each(funs(count)) 

を動作しません。しかし、それは素晴らしいではありません。

提案がありますか?

データ

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

'p'の計算に関しては正しいですか? – akrun

+0

@akrunそうだと思います。それは単に比率です。 – giacomo

答えて

3

私たちすることができますdata.tablemeltとget .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私は最初の解決策を変更しました。それがあなたが望むものであるかどうかを確認してください。私は2番目のものも変更します。明確にするために – akrun

関連する問題