table()的行全为零

时间:2012-10-24 12:53:23

标签: r

这看起来很简单,但我无法在任何地方找到一个简单的答案。

如果我们有以下数据并使用table()

df <- data.frame(x=c("a","b","a"),y=c("b","a","c"))

table(df)
   y
x   a b c
  a 0 1 1
  b 1 0 0

最简单的方法是获得:

   y
x   a b c
  a 0 1 1
  b 1 0 0
  C 0 0 0

之后手动添加c行。

2 个答案:

答案 0 :(得分:8)

这是一种方法。从本质上讲,您需要确保xy都具有相同的级别。我这样做是通过计算各自union()的{​​{1}}然后levels()原始transform()x两者都有这个共同的级别:

y

您的示例有一个简单的解决方案 - 只需> df <- data.frame(x=c("a","b","a"),y=c("b","a","c")) > lev <- with(df, sort(union(levels(x), levels(y)))) > lev [1] "a" "b" "c" > df <- transform(df, x = factor(x, levels = lev), y = factor(y, levels = lev)) > table(df) y x a b c a 0 1 1 b 1 0 0 c 0 0 0 x相同的级别,因为y的级别已完成。在一般情况下,yx都没有一套完整的关卡,我展示的代码将为您提供完整的设置,因此适用于这两种情况。

答案 1 :(得分:0)

更简单的方法是:

levels(df$x) <- levels(df$y) <- union(levels(df$x), levels(df$y))

通常或

levels(df$x) <- levels(df$y)

针对您的具体情况。

然后调用表(df)。基本上,您需要为表格指定可能的“级别”。