如何抑制0行表格的打印?

时间:2012-08-06 18:15:56

标签: r

我有两个因子向量v1v2,它们似乎密切相关(每个因子的熵非常接近它们的联合熵)。的确,当我做table(v1,v2)时,我看到这样的事情:

     v2
 v1  a2   b2   c2
 a1  0    100   0
 b1  0    0     0
 c1  0    0     0
     v2 
 v1  d2   e2   f2
 a1  0    0     0
 b1  0    0     0
 c1  0    0     0

等等 - 每个因素都有几十个级别,所以我得到的所有0都有很多行。

如何打印一个表格,省略只有零的行?

4 个答案:

答案 0 :(得分:4)

每个人似乎都使用rowSums(d)==0或等价物,但这也会抑制任何具有相同数量的1和减1或任何其他零和组合的行。更安全的是使用:

d[ rowSums(d==0) != ncol(d) , ]   

我认为在对象是'table'的结果的情况下,不存在否定条目的风险,但是当该策略不适用于其他设置时会发生风险。

答案 1 :(得分:2)

我将使用rowsums来获取大于0的逻辑向量。然后使用带有索引的vextor,如下所示:

#make an example (please do this for yourself in the future)
d <- table(x=1:5, y=1:5)
d[1, 1] <- 0 #make one row have all 0s

d[rowSums(d) > 0, ]

答案 2 :(得分:2)

使用您的示例:

v1 <- factor(rep("a1", 100), levels = paste0(letters[1:3], 1))
v2 <- factor(rep("b2", 100), levels = paste0(letters[1:6], 2))

R> table(v1, v2)
    v2
v1    a2  b2  c2  d2  e2  f2
  a1   0 100   0   0   0   0
  b1   0   0   0   0   0   0
  c1   0   0   0   0   0   0

然后rowSums()函数将计算要使用的行总和。这是有效的,因为表格是伪装的向量或矩阵。请注意下面的序列,显示我们如何通过询问它们是否超过0来将行和转换为逻辑向量的中间步骤。

R> rowSums(tab)
 a1  b1  c1 
100   0   0 
R> rowSums(tab) > 0
   a1    b1    c1 
 TRUE FALSE FALSE 
R> tab[rowSums(tab) > 0, ]
 a2  b2  c2  d2  e2  f2 
  0 100   0   0   0   0 

上面会删除空白维度。如果您想保留表格格式,请在调用中添加drop = FALSE,但请注意其中的额外,因为我们希望所有列因此, ,之间的空参数:

R> tab[rowSums(tab) > 0, , drop = FALSE]
    v2
v1   a2  b2 c2 d2 e2 f2
  a1  0 100  0  0  0  0

答案 3 :(得分:1)

借用@ Gavin回答的示例数据

v1 <- factor(rep("a1", 100), levels = paste0(letters[1:3], 1))
v2 <- factor(rep("b2", 100), levels = paste0(letters[1:6], 2))

您可以使用droplevels来消除那些没有出现在任何地方的值(相当于全0的行或全0的行)

> table(droplevels(v1), droplevels(v2))

      b2
  a1 100

如果您只想删除行:

> table(droplevels(v1), v2)
    v2
      a2  b2  c2  d2  e2  f2
  a1   0 100   0   0   0   0