我想获得一个跨其他因子变量的变量的前 10 个绝对频率和相对频率的表格。我有一个包含 3 列的数据框:1 列是因子变量,第 2 列是我需要计算的其他变量,3 是作为约束的逻辑变量。(真实数据库有超过 400 万个观测值)
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
所以我需要在“因子”的每个因子中找到“var”的最高绝对和相对频率,其中“log”==TRUE。
我已经用绝对频率尝试过这个(在真实的数据库中我提取了前 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)}
但是我有相对频率的问题,因为我需要将绝对频率除以“var”的行数除以每个因子,而不是“var”的总行数,其中“log”==T。我不知道如何在 tapply 循环中使用它,这样每个因素的分母都会不同。我还想在 1 个 tapply 循环中使用这两个函数,而不是生成许多表并合并结果。但是不知道如何将这两个功能放在一起。