0

我有两个因子向量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

4 回答 4

4

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

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

我想在对象是'table'的结果的情况下,不会有负面条目的风险,但是当这个策略不恰当地应用于其他设置时,风险就会发生。

于 2012-08-06T18:40:41.633 回答
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, ]
于 2012-08-06T18:24:52.383 回答
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
于 2012-08-06T18:31:21.727 回答
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
于 2012-08-06T19:37:24.187 回答