对数据子集进行的频率表包括过滤掉的零值

时间:2015-12-20 09:49:27

标签: r

我有一个数据表,出于问题的目的可以简化为:

eg.ID <- rep(LETTERS[1:26], length.out=30)
eg.filter <- rep(0:1, length.out=30)
eg.df <- data.frame(eg.ID, eg.filter)

给出了:

> eg.df
   eg.ID eg.filter
1      A         0
2      B         1
3      C         0
4      D         1
...    ...       ...
23     W         0
24     X         1
25     Y         0
26     Z         1
27     A         0
28     B         1
29     C         0
30     D         1

我想使用eg.filter列来忽略值为0的所有行,然后计算每个eg.ID发生的次数:

eg.df[eg.df$eg.filter==1,]$eg.ID
table(eg.df[eg.df$eg.filter==1,]$eg.ID)

我得到的初始输出符合预期:

> eg.df[eg.df$eg.filter==1,]$eg.ID
 [1] B D F H J L N P R T V X Z B D
Levels: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

只是eg.filter == 1的字母。

然而,我然后运行table()

> table(eg.df[eg.df$eg.filter==1,]$eg.ID)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
0 2 0 2 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 

并且所有字母egfilter == 0重新出现(尽管正确计数为0)。我不想要它们。

我怀疑我对[]操作员有一个基本的误解,但是尽管拖网手册无法解决它的问题。帮助赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

我们可以使用droplevels删除&#39; eg.ID&#39;中未使用的级别。列。

table(droplevels(eg.df[eg.df$eg.filter>0,]))
#        eg.filter
#eg.ID 1
#    B 2
#    D 2
#    F 1
#    H 1
#    J 1
#    L 1
#    N 1
#    P 1
#    R 1
#    T 1
#    V 1
#    X 1
#    Z 1

答案 1 :(得分:0)

只需将其配置,然后运行table()

# Sample code -- note stringAsFactors = FALSE
df <- data.frame(id = rep(LETTERS[1:26], length.out=30), filter = rep(0:1, length.out=30), stringsAsFactors = FALSE)

table(df[df$filter > 0, ])

输出:

 > table(df[df$filter > 0, ])
  filter
id  1
  B 2
  D 2
  F 1
  H 1
  J 1
  L 1
  N 1
  P 1
  R 1
  T 1
  V 1
  X 1
  Z 1