我想用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)))))
有没有更干净的方法来做这件事?
发布于 2019-03-15 00:24:20
我将继续回答,尽管我仍然反对缺乏标准。如果我们认为“整洁”是“凌乱”的对立面,那么我们应该首先将输入数据整理成较长的格式。然后我们就可以做双向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
https://stackoverflow.com/questions/55167345
复制相似问题