我有两个因子向量v1
和v2
,它们似乎密切相关(每个因子的熵非常接近它们的联合熵)。的确,当我做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都有很多行。
如何打印一个表格,省略只有零的行?
答案 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