ある変数の絶対度数と相対度数の上位 10 の表を、他の因子変数全体で取得したいと考えています。3列のデータフレームがあります。1列は因子変数、2列目はカウントする必要がある他の変数、3列は制約としての論理変数です。(実際のデータベースには 4mln 以上の観測があります)
dtf<-data.frame(c("a","a","b","c","b"),c("aaa","bbb","aaa","aaa","bbb"),c(TRUE,FALSE,TRUE,TRUE,TRUE))
colnames(dtf)<-c("factor","var","log")
dtf
factor var log
1 a aaa TRUE
2 a bbb FALSE
3 b aaa TRUE
4 c aaa TRUE
5 b bbb TRUE
したがって、「factor」の各因子で「log」== TRUE である「var」の上位の絶対頻度と相対頻度を見つける必要があります。
絶対頻度でこれを試しました(実際のデータベースでは、上位10を抽出します。ここでは2行を取得します):
t1<-tapply(dtf$var[dtf$log==T],dtf$factor[dtf$log==T],function(x)(head(sort(table(x),decreasing=T),n=2L)))
# Returns array of lists: list of factors containing list of top frequencies
t2<-(t1, ldply)
# Split list inside by id and freq
t3<-do.call(rbind, lapply(t2, data.frame))
# Returns dataframe of top "var" values and corresponding freq for each group in "factor"
# Factor variable's labels are saved as row.names in t3
次の関数は、要因別にグループ化するのではなく、データベース全体の相対頻度を見つけるのに役立ちます。
getrelfreq<-function(x){
v<-table(x)
v_rel<-v/nrow(dtf[dtf$log==T,])
head(sort(v_rel,decreasing=T),n=2L)}
しかし、「log」== Tの「var」のTOTAL nrowではなく、絶対頻度を「var」の行数で割る必要があるため、相対頻度に問題があります。分母が因子ごとに異なるように、タップループでそれを使用する方法がわかりません。また、多くのテーブルを生成して結果をマージするのではなく、1 つのタップループで両方の関数を使用したいと考えています。しかし、そのような2つの機能を組み合わせる方法がわかりません。