我想在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