当并非所有值都出现在所有列中时,如何在 R 中创建多变量频率 table?

How do you make a multiple variable frequency table in R when not all values are present in all columns?

我想在 R 中创建这样的频率 table:

df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,9,8,7))
apply(df, 2, table)

# outputs:  
#   aa bb cc
# 7  1  1  2
# 8  2  1  1
# 9  1  2  1

但是,如果 df 的其中一列的计数为 0(例如,如果我们更改上面的内容以使 df$cc 没有 9),我们将得到一个列表而不是一个漂亮的数据框。

# example that gives a list
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, table)

有什么简单的方法可以做类似的事情,无论计数如何都能保证数据帧输出?

我可以想象出许多看似凌乱或被黑的解决方案,例如,这会产生所需的结果:

# example of a messy but correct solution
df = data.frame(aa = c(9,8,7,8), bb = c(9,7,9,8), cc = c(7,8,8,7))
apply(df, 2, function(x) summary(factor(x, levels = unique(unlist(df)))))

有更简洁的方法吗?

我会继续回答,虽然我仍然反对缺乏标准。如果我们把"tidy"想成"messy"的反义词,那么我们应该先把输入的数据整理成长格式。然后我们可以做一个双向 table:

library(tidyr)
df %>% gather %>%
  with(table(value, key))
#      key
# value aa bb cc
#     7  1  1  2
#     8  2  1  2
#     9  1  2  0

感谢 Markus 提供基础 R 版本:

table(stack(df))
#       ind
# values aa bb cc
#      7  1  1  2
#      8  2  1  2
#      9  1  2  0