1

ある変数の絶対度数と相対度数の上位 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つの機能を組み合わせる方法がわかりません。

4

1 に答える 1