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

时间:2019-03-14 16:15:17

标签: r dataframe apply frequency

我想在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),我们将获得一个列表而不是漂亮的数据框。

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

是否有一种更清洁的方法?

1 个答案:

答案 0 :(得分:2)

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