1

我想获得一个跨其他因子变量的变量的前 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 循环中使用这两个函数,而不是生成许多表并合并结果。但是不知道如何将这两个功能放在一起。

4

1 回答 1

1

如果我对您的理解正确,您可以执行我在下面写的内容。用于dcast获取 each 中每个 的频率varfactor然后rowSums()将它们相加以获得所有因子中每个 var 的绝对频率。您可以使用prop.table来计算var每个factor. 请注意,我对您的示例数据进行了轻微更改,以便您可以了解每个阶段发生的情况(我为when添加了一个'bbb'值)。试试这个:factor blog == TRUE

#Data frame (note 2 values for 'bbb' for factor 'b' when log == TRUE)
dtf<-data.frame(c("a","a","b","c","b","b"),c("aaa","bbb","aaa","aaa","bbb","bbb"),c(TRUE,FALSE,TRUE,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
#6      b bbb  TRUE


library(reshape2)

# Find frequency of each var across each factor using dcast
mydat <- dcast( dtf[dtf$log==TRUE , ] , var ~ factor , sum )
#  var a b c
#1 aaa 1 1 1
#2 bbb 0 2 0

# Use rowSums to find absolute frequency of each var across all groups
mydat$counts <- rowSums( mydat[,-1] )
# Order by decreasing frequency and just use first 10 rows
mydat[ order( mydat$counts , decreasing = TRUE ) , ]
#  var a b c counts
#1 aaa 1 1 1      3
#2 bbb 0 2 0      2


# Relative proportions for each var across the factors
data.frame( var = mydat$var , round( prop.table( as.matrix( mydat[,-c(1,ncol(mydat))]) , 1 ) , 2 ) )
#  var    a    b    c
#1 aaa 0.33 0.33 0.33
#2 bbb 0.00 1.00 0.00
于 2013-04-16T12:04:54.527 回答