当并非所有值中都存在所有列中时,如何在R中制作一个多变量频率表



我想在r:

中制作这样的频率表
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),我们将获得列表而不是一个不错的dataframe。

# 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)))))

是否有更干净的方法?

我会继续回答,尽管我仍然反对缺乏标准。如果我们将"整洁"视为"混乱"的对立面,那么我们应该首先将输入数据整理成长格式。然后,我们可以进行双向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

最新更新