如何在R中使用table()函数摆脱空值(0个值)

时间:2019-05-21 19:37:26

标签: r

我有一个简单的问题。我想用原始表的3个变量制作一个频率表。如果我这样做

as.data.frame(table(df$var1,df$var2,df$var3))

由于它提供了3个变量的所有可能组合,并且每个变量都有很多值,所以我得到一个错误:“试图用> = 2 ^ 31个元素组成一个表”。

问题在于许多组合实际上是空的。换句话说,其中许多可能的组合的频率为0,因此我想知道如何使R仅考虑非空频率(以便函数table()使用我的3个变量而不会给出错误信息。

有什么主意吗?

非常感谢您阅读。

一个非常简化的表(不是我原来的表-因为我有很多值,所以当运行“ as.data.frame(table())¨时,这三个表的笛卡尔积超出了2 ^ 31个元素)可以是:

var1           var2           var3   var4  var5
0               a1            1234     a     1
1               a2            1234     b     2
1               a2            1235     c     2
1               a2            1235     a     7
1               a1            1235     d     3

我想要的是代码中前三个变量的频率:

as.data.frame(table(df$var1,df$var2,df$var3))

这是我正在尝试的事情:

subset(table(df$var1,df$var2,df$var3),table(df$var1,df$var2,df$var3)$Freq!='0') 

droplevels(table(df$var1,df$var2,df$var3))

没有运气。

在为我的示例概述的情况下,代码as.data.frame(table(df $ var1,df $ var2,df $ var3))提供了这样的表格-如您所知,创建了一个额外的变量“ Freq “,它给出了该行中3个变量的每种组合出现的时间:

var1           var2           var3   Freq
0               a1            1234     1 
0               a1            1235     0
0               a2            1234     0 
0               a2            1235     0
1               a1            1234     0 
1               a1            1235     1
1               a2            1234     1 
1               a2            1235     1

但是,正如我所说的那样,由于频率为0的行很多,因此在运行函数table()时不考虑R可能会使R的计算显着简化,其元素少于2 ^ 31,因此可以提供结果,而不会出现任何错误消息。因此,如果可用,在应用此替代方法后,我期望的结果是这样的(其中在运行table()时不计算所有Freq = 0的行):

var1           var2           var3    Freq
0               a1            1234     1 
1               a1            1235     1
1               a2            1234     1 
1               a2            1235     1

1 个答案:

答案 0 :(得分:0)

好吧,我想我找到了解决方案。基本上是这样:

a <-summarise(group_by(df,var1,var2,var3),count = n())