【问题标题】:Relative frequency in r by factorr 中的相对频率(按因子)
【发布时间】:2013-04-08 18:33:59
【问题描述】:

我想获得一个表,其中包含一个变量在其他因子变量中的前 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 在“factor”的每个因素中。

我已经用绝对频率尝试过这个(在真实的数据库中我提取了前 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 循环中使用这两个函数,而不是生成许多表并合并结果。但是不知道如何将这两个功能放在一起。

【问题讨论】:

    标签: r statistics frequency tapply


    【解决方案1】:

    如果我对您的理解正确,您可以执行我在下面所写的操作。使用dcast 获得每个factor 中每个var 的频率,然后使用rowSums() 将它们相加以获得每个变量在所有因素中的绝对频率。您可以使用prop.table 计算出每个var 在每个factor 中的相对频率。请注意,我对您的示例数据进行了轻微更改,以便您可以了解每个阶段发生的情况(当 log == TRUE 时,我为 factor b 添加了 'bbb' 值)。试试这个:

    #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
    

    【讨论】:

    • 非常感谢您提供线索!但是我的数据有问题,我的“var”也是因子变量,其中包含 6000 多个级别,所以我的 mydat 会非常庞大​​。但我想这将需要与获得前 10 个频率相同的系统时间?除了你的方法,我不知道如何获得计数,所以别无选择:)
    • @Asayat 好吧,我想你必须计算所有频率(足够接近)才能找到前 10 个。试试看 - 如果它让你的计算机崩溃,那么我们需要找到另一种方法! :-) 你有多少行数据?因子中有多少个不同的变量? unqiue(dtf$factor)
    • 总共 3,221,155 行,仅使用 log=TRUE 子集 dtf 将产生 1,222,490 行。 dtf$factor 有 16 个不同的值,dtf$var 有 6421 个唯一值。抱歉回复晚了,我的内存现在有问题:)
    • @Asayat 你在 Windows 上吗?您使用的是 64 位还是 32 位 R? 1.2e6 行很多,但在 R 中绝对可以处理,尤其是当您创建具有
    • 我现在在使用 mac,认为这只是我的笔记本电脑问题,也许它太旧了,不适合这样的事情。但是我可以在 12 小时内在我的办公室尝试其他计算机(对不起,当被问到问题时,我有更强大的电脑,但不是现在,时区问题,将在 12 小时内回到办公室:))。我猜你的答案将是完美的答案,因为 R 无论如何都会计算所有频率,所以可能不会有任何其他方法计算得更少
    猜你喜欢
    • 2018-10-25
    • 2017-07-18
    • 1970-01-01
    • 2019-10-17
    • 2012-02-11
    • 1970-01-01
    • 2018-09-04
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多